如何在 Makefile.am 或 configure.ac 中包含 -lm
How to include -lm in Makefile.am or configure.ac
我有一个名为 neuromz
的程序,我使用
编译它
gcc neuromz.c -lm -o neuromz
工作正常,但如果我尝试将 configure.ac
和 Makefile.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
正如@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 变量。
我有一个名为 neuromz
的程序,我使用
gcc neuromz.c -lm -o neuromz
工作正常,但如果我尝试将 configure.ac
和 Makefile.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
正如@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 变量。