2015-10-06 74 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)')。 –