首页 > 学院 > 开发设计 > 正文

make出现的undefined问题

2019-11-08 03:07:17
字体:
来源:转载
供稿:网友

make 与undefined reference

在连接库的时候,会出现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)是两个不同的函数。

我出现的问题在第二个,注意被依赖的库需要放在后面。

ar 打包库

ar打包出来的库函数需要用连接 -L./ -lXXX 头文件,以及库的名字。ar -r 就可以了

记录一下我的第二个make相关的情况

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 的问题,也就是上面的第二点所说明的问题。编译库的顺序的问题了。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表