make出现的undefined问题

  • 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_main
TARGET2 = libtxllmtrain.a
TARGET3 = test_link
TARGET4 = test_main_ln

OBJ1 = txl_lmtrain.o txl_lmtrain_api.o lex.o test_main.o
OBJ2 = txl_lmtrain.o txl_lmtrain_api.o lex.o
OBJ3 = test_link.o
#OBJ4 = test_main_ln.o txl_lmtrain.o txl_lmtrain_api.o lex.o
OBJ4 = test_main_ln.o


all: $(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 的问题,也就是上面的第二点所说明的问题。编译库的顺序的问题了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值