在连接库的时候,会出现undefined reference的现象,大致有以下几种可能。 该错误的本质是编译时声明的实体(变量、函数等)在连接时找不到对应的定义。 经过前后摸索并查阅一些资料,把可能的原因总结如下,供各位参考: 1. 没有指定对应的库(.o/.a/.so) 使用了库中定义的实体,但没有指定库(-lXXX)或者没有指定库路径(-LYYY),会导致该错误 2. 连接库参数的顺序不对 (缺省情况下)每个库在连接时按照命令行参数的顺序被搜索并且只搜索一次, 后面的库如果用到了前面的库中定义的实体,可能导致该错误 所以最好按照库的依赖关系来按序写参数,被依赖的库放在后面 3. gcc/ld版本不匹配 gcc/ld的各版本间兼容性并不是很好(最明显表现于3.3和3.4之间), 比如低版本编译的库用高版本来进行连接,也可能会导致该错误 4. C/C++交叉编译/连接 比如用C++连接C编译的库,但没有在声明实体时使用extern “C”, 也会导致该错误。反之亦然。 Tips:gcc会根据不同的文件扩展名使用不同语言编译,比如对.c使用C,对.C/*.cpp使用C++ 5. 函数定义与实现不一致 比如定义:int aaa(int b) 实现int aaa(u_int b)是两个不同的函数。
Makefile 文件
TARGET1 = test_mainTARGET2 = libtxllmtrain.aTARGET3 = test_linkTARGET4 = test_main_lnOBJ1 = txl_lmtrain.o txl_lmtrain_api.o lex.o test_main.oOBJ2 = txl_lmtrain.o txl_lmtrain_api.o lex.oOBJ3 = test_link.o#OBJ4 = test_main_ln.o txl_lmtrain.o txl_lmtrain_api.o lex.oOBJ4 = test_main_ln.oall: $(TARGET1) $(TARGET2) rm -rf output mkdir -p output/include mkdir -p output/lib/ cp *.h output/include/ cp $(TARGET1) output cp $(TARGET2) output/lib/$(TARGET1) : $(OBJ1) $(CXX) -g -o $@ $^ $(INCDIR) $(LIBDIR)$(TARGET2) : $(OBJ2) ar -r $(TARGET2) $(OBJ2)$(TARGET3) : $(OBJ3) $(CXX) -g -o $@ $^ -L. -ltxllmtrain $(INCDIR) $(LIBDIR)$(TARGET4) : $(OBJ4) $(CXX) -g -o $@ $^ $(INCDIR) $(LIBDIR) -L. -ltxllmtrain上面的情况中:
TARGET1 是可以make过的,没有用到编译连接的库; TARGET2 这个就是 ar -r 的用法了,库需要命名为libtxllmtrain.a,连接的时候 -L./ -ltxllmtrain 就可以了; TARGET3 这个用了编译链接的库,因为 libtxllmtrain.a 这个库依赖于后面的库,所以了这个是可以过的; TARGET4 这个会出现 undefined reference 的问题,也就是上面的第二点所说明的问题。编译库的顺序的问题了。新闻热点
疑难解答