簡體   English   中英

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

[英]How to include -lm in Makefile.am or configure.ac

我有一個名為neuromz的程序,可以使用該程序進行編譯

gcc neuromz.c -lm -o neuromz

它工作正常,但是如果我嘗試使用Makefile.amconfigure.acMakefile.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 

Automake總是將編譯和鏈接分開,因為這通常會使構建盡可能經濟。

neuromz_CFLAGS = -lm

-lm添加到用於編譯neuromz.c的編譯器選項( CFLAGS )中。 但是-lm (= 鏈接數學庫 )是一個鏈接選項,在編譯時會被忽略。 在鏈接選項( LDADD )中需要它:

neuromz_LDADD = -lm

請參見自動制作手冊8.4程序和庫變量

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM