2010-11-22 88 views
7

我正在嘗試使用Autotools來構建我的C程序,該程序需要與某些庫鏈接。它只包含一個C源文件。錯誤位置的鏈接器標誌

這是與它相關的Makefile.am:

bin_PROGRAMS=game 
game_SOURCES=main.c 
game_CFLAGS=`pkg-config --cflags libglfw` 
game_LDFLAGS=`pkg-config --libs libglfw` 

當我運行make,它試圖以此來編譯:

gcc `pkg-config --cflags libglfw` -g -O2 `pkg-config --libs libglfw` -o game game-main.o 

然而這是錯誤的,因爲庫鏈接標誌必須在最後,否則會給出未定義引用的錯誤。例如,如果我運行這個:

gcc `pkg-config --cflags libglfw` -g -O2 -o game game-main.o `pkg-config --libs libglfw` 

它編譯得很好。

我該如何做到這樣LDFLAGS主要被添加在最後,而不是在中間?

回答

10

您可以從不濫用LDFLAGS庫開始。 LDFLAGS用於鏈接器標記。使用foo_LDADD(對於可執行文件)或foobar_LIBADD(在生成庫時)列出鏈接庫。

此外,在Makefile.am內運行pkg-config是不必要的和浪費的。只需使用:

 
game_CFLAGS = ${libglfw_CFLAGS} 
game_LDADD = ${libglfw_LIBS} 

libglfw_CFLAGS,LIBS由這configure.ac填充:

PKG_CHECK_MODULES([libglfw], [libglfw])

+0

我怎麼會用一個常規makefile解決這個問題,而不是自動工具?據我所知,make不尊重LDADD(只是autotools)。 – 2012-08-20 19:16:23

+1

後續:使用常規makefile,解決方案是使用'LOADLIBES = -lm'而不是'LDFLAGS = -lm'。 – 2012-08-20 19:33:48