前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >再议GCC编译时的静态库依赖顺序问题

再议GCC编译时的静态库依赖顺序问题

作者头像
一见
发布2018-08-06 19:26:34
3.6K0
发布2018-08-06 19:26:34
举报
文章被收录于专栏:蓝天蓝天

GCC编译时的静态库依赖次顺问题.pdf

假设有如三个源代码文件:

代码语言:javascript
复制
$ cat a.cpp
void a()
{
}
$ cat b.cpp
extern void a();
void b()
{
a(); // 调用a.cpp中的a()
}
$ cat x.cpp
extern void b();
int main()
{
b(); // 调用b.cpp中的b()
return 0;
}

对应的Makefile文件:

代码语言:javascript
复制
all: x
liba.a: a.o
libb.a: b.o
x: x.o liba.a libb.a # 问题出在这儿
g++ -g -o $@ $^
a.o: a.cpp
g++ -g -c $^
b.o: b.cpp
g++ -g -c $^
x.o: x.cpp
g++ -g -c $^
clean:
rm -f a.o b.o x.o x

使用上面的Makefile编译,将会遇到如下所示的“undefined reference”问题:

代码语言:javascript
复制
g++ -g -c x.cpp
g++ -g -c a.cpp
g++ -g -c b.cpp
g++ -g -o x x.o liba.a libb.a # 改成“g++ -g -o x x.o libb.a liba.a”即可解决
libb.a(b.o): In function `b()':
/tmp/b.cpp:2: undefined reference to `a()'
collect2: ld returned 1 exit status
make: *** [x] Error 1

这个问题的原因是b.cpp依赖a.cpp,gcc要求(实际是ld要求)libb.a须放在liba.a前面,即需要改成:g++ -g -o x x.o libb.a liba.a,也就是被依赖的库需要放在后头。

这是最常规的解决办法,除此之外,只需要加入--start-group和--end-group两个链接参数,即可保持被依赖的库放在前头,也就是改成如下即可:g++ -g -o $@ -Wl,--start-group $^ -Wl,--end-group。

这里的“-Wl,”表示后面跟着的参数是传递给链接器ld的,gcc不关心具体是啥。“--start-group”表示范围的开始;“--end-group”表示范围的结束,是可选的。位于“--end-group”之后的仍然要求被依赖的库放在后头。注意“--start-group”不能重复,相关链接参数:--whole-archive 和 --no-whole-archive。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-09-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档