[英]How to adapt configure.ac to add a library target in final Makefile?
[英]How to include -lm in Makefile.am or configure.ac
我有一個名為neuromz
的程序,可以使用該程序進行編譯
gcc neuromz.c -lm -o neuromz
它工作正常,但是如果我嘗試使用Makefile.am
將configure.ac
和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
Automake總是將編譯和鏈接分開,因為這通常會使構建盡可能經濟。
neuromz_CFLAGS = -lm
將-lm
添加到用於編譯neuromz.c
的編譯器選項( CFLAGS
)中。 但是-lm
(= 鏈接數學庫 )是一個鏈接選項,在編譯時會被忽略。 在鏈接選項( LDADD
)中需要它:
neuromz_LDADD = -lm
如@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.