我有一个名为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
是GCC有益地转化为必要的编译步骤和链接步骤,好像您做到了:
gcc -c -o neuromz.o neuromz.c # Compile
gcc -o neuromz neuromz.o -lm # Link
自动收益总是分开编译和链接,因为这通常会使建立尽可能经济的。
neuromz_CFLAGS = -lm
将-lm
添加到编译neuromz.c
的编译器选项(CFLAGS
)中。但是-lm
(= 链接数学库)是一个链接选项,并在编译中忽略了。你需要它在链接选项(LDADD
)中:
neuromz_LDADD = -lm
请参阅《汽车手册》 8.4程序和库变量
如已经描述的@mikekinghan,用于将额外库指定到程序中的自动化变量为 *_LDADD
。但是,我补充说,如果您只构建一个程序,或者您构建的所有程序都需要相同的库,则可以使用LDADD
。这可能更方便,有时也会产生较小的 Makefile
's:
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
中对此表示任何信息,也不必担心要使用的自动借记变量。