2017-12-03 161 views
2

我有一个程序叫neuromz,我编译使用如何包括Makefile.am -lm或configure.ac

gcc neuromz.c -lm -o neuromz 

它的做工精细,但如果我尝试添加到我的项目configure.acMakefile.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' 

我该如何解决?

回答

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变量。

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