【问题标题】:How to include -lm in Makefile.am or configure.ac如何在 Makefile.am 或 configure.ac 中包含 -lm
【发布时间】:2018-05-16 23:06:35
【问题描述】:

我有一个名为 neuromz 的程序,我使用

进行编译
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'

我该如何解决?

【问题讨论】:

    标签: c makefile autotools


    【解决方案1】:

    你的命令行:

    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

    【讨论】:

      【解决方案2】:

      正如@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 变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-17
        • 2021-11-06
        相关资源
        最近更新 更多