2015-10-06 90 views
0

我有一個makefile成功構建* .obj文件。在到達鏈接部分後,我對undefined reference有很多錯誤。C++ makefile - 鏈接器找不到外部庫

CC = g++ 

INCLUDE_DIRS = -I/usr/include/freetype2/ -I../MyLibs/ \ 
       -I../MyLibs/svg/ 

LIB_DIRS = -L./ -L../MyLibs/ -L/usr/lib64/ -L/usr/lib64/mysql/ 

LIBS = -lMyUtils -lfreetype -lmysqlclient -lsqlite3 


CFLAGS = -std=c++11 -lm -lpthread -lstdc++ -ldl -Wall -O2 \ 
     $(INCLUDE_DIRS) 

OBJ = *** list of obj files *** 

BIN = my_program 

$(BIN): $(OBJ) $(OBJ) 
    $(CC) $(CFLAGS) $(LIB_DIRS) $(LIBS) $^ -o [email protected] 

我無法看到什麼是錯的。 MyUtils是靜態庫,我也使用不同的生成文件(如果我看看ar,我看到所有的obj存在)。另外,我使用相同的庫來構建另一個項目(動態庫),並且構建已正確完成。

我在CentOS 6.5下使用gcc 4.7.2。

+0

對我來說,'$(CFLAGS)$(LIB_DIRS)$(LIBS)'當第一和第三個變量包含'-l'選項,但第二個變量包含'-L'看起來很可疑。你可以試試'$(LIB_DIRS)$(CFLAGS)$(LIBS)'? – Gluttton

+0

@Gluttton我已經將所有-l和所有-L都移動了,但是問題仍然存在 –

+0

奇怪的是在$(BIN)''的依賴列表上列出$(OBJS)'兩次。我不知道這是否會導致編譯問題,但它可能會導致鏈接問題。 – nobar

回答

4

您的鏈接器配方將庫放在需要它們的對象文件之前。鏈接器 將只檢查一個庫來解析它在先前鏈接的對象中已經記錄的未定義引用,因此如果您將所有庫放在所有對象文件之前,則沒有任何庫檢查到 ,並檢查所有對這些庫的調用目標文件最終未定義。

重寫例如爲:

$(BIN): $(OBJ) 
    $(CC) $(CFLAGS) $^ $(LIB_DIRS) $(LIBS) -o [email protected] 

(而無需重複$(OBJ)prerequisities)

+0

更簡單:從'make -f/dev/null --print-data-base'複製默認鏈接規則,即$(LINK.cc)$^$(LOADLIBES)$(LDLIBS)-o $ @' (並將'$(LIB_DIRS)'放入標準'$(LDFLAGS)')。 –