如何在Makefile.am或configure.ac中包含-lm

时间:2017-12-03 09:45:42

标签: c makefile autotools

我有一个名为neuromz的程序,我使用

编译
gcc neuromz.c -lm -o neuromz

工作正常但是如果我尝试使用configure.ac Makefile.amMakefile.am添加到我的项目中:

bin_PROGRAMS = neuromz
neuromz_SOURCES = neuromz.c neuromz.h ann.c ann.h 
neuromz_CFLAGS = -lm

结果是:

/home/mz/programming/ctest/ANN/ann.c:11: undefined reference to `exp'
/home/mz/programming/ctest/ANN/ann.c:11: undefined reference to `exp'

我该如何解决?

2 个答案:

答案 0 :(得分:4)

您的命令行:

gcc neuromz.c -lm -o neuromz

是gcc有助于转换为必要的编译步骤的简写 链接步骤,就像你做的那样:

gcc -c -o neuromz.o neuromz.c   # Compile
gcc -o neuromz neuromz.o -lm    # Link 

Automake总是将编译和链接分开,因为这通常会产生 建造尽可能经济。

neuromz_CFLAGS = -lm

-lm添加到编译器选项(CFLAGS)以编译neuromz.c。 但是-lm(= 链接数学库)是一个链接选项,在编译时会被忽略。你需要它 在链接选项(LDADD)中:

neuromz_LDADD = -lm

请参阅automake manual 8.4 Program and Library Variables

答案 1 :(得分:0)

正如@MikeKinghan已经描述的那样,用于在程序中指定额外库的Automake变量是*_LDADD。但是,我要补充一点,如果您只构建一个程序,或者您正在构建的所有程序都需要相同的库,那么您可以使用LDADD代替。这可能更方便,有时也会产生更小的Makefile

bin_PROGRAMS = neuromz
LDADD = -lm

neuromz_SOURCES = neuromz.c neuromz.h ann.c ann.h 

但是,如果您对构建系统构建的程序的libm做出一劳永逸的决定感到满意,那么我建议您使用Autoconf而不是Automake来处理它。如果你把它放在configure.ac ......

AC_SEARCH_LIBS([sqrt], [m])

......然后

  • 您的configure脚本会检查libm是否需要明确链接(取决于您的环境和工具链),并且仅在必要时添加-lm

  • 您不需要在Makefile.am中说出任何相关内容,也不关心要使用哪个Automake变量。