我有一个名为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'
我该如何解决?
答案 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
答案 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变量。