2017-12-03 216 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