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



我有一个名为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

是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中对此表示任何信息,也不必担心要使用的自动借记变量。

最新更新