前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gcc链接参数--whole-archive的作用

gcc链接参数--whole-archive的作用

作者头像
一见
发布2019-03-14 15:45:48
8.7K0
发布2019-03-14 15:45:48
举报
文章被收录于专栏:蓝天蓝天
代码语言:javascript
复制
 // a.h 
 	extern void foo(); 
 	// a.cpp 
 	#include  
 	void foo() 
 	{ 
 	    printf("foo\n"); 
 	} 
 	// x.cpp 
 	#include "a.h" 
 	int main() 
 	{ 
 	        foo(); 
 	        return 0; 
 	} 
 	// Makefile 
 	all: x 
 	x: x.cpp liba.so 
 	g++ -g -o $@ $^ 
 	liba.so: liba.a 
 	g++ -g -fPIC -shared -o $@ $^ 
 	#g++ -g -fPIC -shared -o $@ -Wl,--whole-archive $^ -Wl,-no-whole-archive 
 	liba.a: a.o 
 	ar cru $@ $^ 
 	a.o: a.cpp 
 	g++ -g -c $^ 
 	clean: 
 	rm -f x a.o liba.a liba.so 
 	$ make 
 	g++ -g -c a.cpp 
 	ar cru liba.a a.o 
 	g++ -g -fPIC -shared -o liba.so liba.a 
 	#g++ -g -fPIC -shared -o liba.so -Wl,--whole-archive liba.a -Wl,-no-whole-archive 
 	g++ -g -o x x.cpp liba.so 
 	/tmp/cc6UYIAF.o: In function `main': 
 	/data/jayyi/ld/x.cpp:5: undefined reference to `foo()' 
 	collect2: ld returned 1 exit status 
 	make: *** [x] Error 1 

默认情况下,对于未使用到的符号(函数是一种符号),链接器不会将它们链接进共享库和可执行程序。

这个时候,可以启用链接参数“--whole-archive”来告诉链接器,将后面库中所有符号都链接进来,参数“-no-whole-archive”则是重置,以避免后面库的所有符号被链接进来。

代码语言:javascript
复制
 	// Makefile 
 	all: x 
 	x: x.cpp liba.so 
 	g++ -g -o $@ $^ 
 	liba.so: liba.a 
 	g++ -g -fPIC -shared -o $@ -Wl,--whole-archive $^ -Wl,-no-whole-archive 
 	liba.a: a.o 
 	ar cru $@ $^ 
 	a.o: a.cpp 
 	g++ -g -c $^ 
 	clean: 
 	rm -f x a.o liba.a liba.so 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-11-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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