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

How to include -lm in Makefile.am or configure.ac

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

编译它
gcc neuromz.c -lm -o neuromz

工作正常,但如果我尝试将 configure.acMakefile.am 添加到我的项目中,使用 Makefile.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'

我该如何解决?

你的命令行:

gcc neuromz.c -lm -o neuromz

是 shorthand gcc 帮助转换为必要的编译步骤和 link 步,就像你做的那样:

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

Automake 始终将编译和 linkage 分开,因为这通常会使 尽可能经济地建造。

neuromz_CFLAGS = -lm

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

neuromz_LDADD = -lm

automake manual 8.4 Program and Library Variables

正如@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 变量。