四时宝库

程序员的知识宝库

linux编译引用静态库总是报错:未定义的引用

Makefile中编译一个工程,工程引用了libevent库。

引用动态库没问题,但是改成引用静态库.a文件时编译总是报错:未定义的引用

Makefile中原始写法如下:

EXT_CCFLAGS = -L./lib -levent -levent_core -levent_extra -levent_pthreads

……

$(CC) $(EXT_CCFLAGS) -o $@ $(OBJ)

经过分析结合网上百度,调整引用静态库的编译顺序即可编译通过。

Makefile中修改后写法如下:

EXT_CCFLAGS = -L./lib -levent -levent_core -levent_extra -levent_pthreads

……

$(CC) -o $@ $(OBJ) $(EXT_CCFLAGS)

总结:以后引用静态库尽量放到$(OBJ)后面

Makefile中对于library的查找

查找需要连接的符号名是从前向后找---即最后一个-l库文件最先调用;根据-L指定的路径顺序查找;

不同 目录下的同名的库,只取第一个(从左向右:即依次调用,最后一个生效的是最后调用:即最左边的),后面同名库被忽略;

g++ ... obj($?) -l(上层逻辑lib) -l(中间封装lib) -l(基础lib) -l(系统lib) -o $@

对于符号的查找

从左向右查找,如果是主程序块和静态库,不能定位地址就报错: ‘undefined reference to: xxx’

如果是链接成动态库,则假设该符号在load 的时候地址重定位。如果找不到对应的动态库,则会在load的时候报:“undefined symbol: xxx“这样的错误

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接