c - 如何为同一 autotools 项目中的两个程序设置不同的构建选项

标签 c autotools autoconf

我有一个包含两个程序的简单 autotools 项目:一个两个

只有一个程序依赖于一个库(在这个例子中是math),而我 希望其他程序不与该库链接。

这是我的文件:

configure.ac

AC_INIT([test], [0.1], [somebody@example.com])
AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_PROG_CC
AC_CHECK_LIB([m], [log])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT    

Makefile.am

bin_PROGRAMS = one two
one_SOURCES = one.c
two_SOURCES = two.c

one.c(删除标题)

int main(void)
{
    /* do depend on lib math*/
    printf("log[15] = %f\n", log(15));
    return 0;
}

two.c(删除标题)

int main(void)
{
    /* do NOT depend on lib math*/
    printf("15 = %d\n", 15);
    return 0;
}

当我构建它时

autoreconf --install
./configure
make

程序构建良好:

# compilation 
gcc .... -c -o one.o one.c
# link
gcc .... -o one one.o -lm
# compilation 
gcc .... -c -o two.o two.c
# link THE PROBLEM IS HERE, I don't want `-lm` to be added here
gcc .... -o two two.o -lm     

最佳答案

Only one of the program depends on a library (math in this example), and I would like that the other program not to be linked with this library.

在同一 Autotools 项目中构建具有不同选项的程序需要一些注意。通常的方法是为并非所有项目都通用的那些位创建单独的输出变量,并在您的 Makefile.am 中使用它们来定义适当的每个目标构建变量。

在您的示例中,指定特定于目标的数学库的链接选项,因此您需要将它们捕获到它们自己的变量中。 AC_CHECK_LIBAC_SEARCH_LIBS 宏都将适当的库链接选项添加到 LIBS 输出变量中,这是 Automake 从中提取全局变量的来源之一链接选项,所以如果你使用这些,你还需要做一些事情来避免数学库选项保留在 LIBS 中。或者,您可以设计一些其他机制来测试数学库选项。

一个好的技巧是在运行AC_CHECK_LIB 之前保存LIBS 的值,然后提取数学库选项(如果有的话),然后恢复原始值。这是一个相对常见的 Autoconf 习惯用法。例如,

LIBS_save=$LIBS

AC_CHECK_LIB([m], [log])

LIBM_LDFLAGS=${LIBS%${LIBS_save}}
AC_SUBST([LIBM_LDFLAGS])

LIBS=$LIBS_save

您的 Makefile.am 可能如下所示:

bin_PROGRAMS = one two

one_SOURCES = one.c
one_LDADD = $(LIBM_LDFLAGS)

two_SOURCES = two.c

关于c - 如何为同一 autotools 项目中的两个程序设置不同的构建选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52647761/

相关文章:

installation - 向 Autoconf 生成的配置脚本添加自定义安装目录选项

autotools - Autoconf:将更多内容放入 config.h 或生成 confdefs.h

c++ - Autotools 条件包含

autotools - 如何配置 autotools/gcc 以使用绝对路径打印警告和错误?

c - SIGABRT 在 fclose 上吗?

裸机可移植库中的 C99 "atomic"加载

c - 基本C程序中的内存分配和未使用字节

c - GCC 程序未定义对函数的引用(多个文件夹)

c++ - 如何在 C++ Autotools 项目中使用不同版本的 g++ 进行编译

linux - 在配置脚本中安装依赖项