再议GCC编译时的静态库依赖顺序问题_weixin_33895516的博客-程序员秘密

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


相关博文1:http://blog.chinaunix.net/uid-20682147-id-76330.html
相关博文:http://blog.chinaunix.net/uid-20682147-id-5096676.html

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

$ 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文件:

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”问题:

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。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33895516/article/details/89866470

智能推荐

【css】line-height实现垂直居中_richest_qi的博客-程序员秘密

替换元素与非替换元素<body> <div>hello</div> <span>world</span> <img src="./imgs/路飞.jpg" alt="路飞"></body>div,span,img{ width:100px; height:100px; background-color:lightskyblue; margin:10px;}块级元素可以设置width

解决WebLogic Server访问浏览器提示服务不可用异常503–Service Unavailable_from rfc 2068 hypertext transfer protocol -- http/_bluss-yang的博客-程序员秘密

转载http://www.xwood.net/_site_domain_/_root/5870/5874/t_c262627.html一、异常描述启动weblogic应用服务,通过部署名称访问服务,报出“Error 503--Service Unavailable ..From RFC 2068 Hypertext Transfer Protocol -- HTTP/1.1:..”,如下图所示异常描述如下1 2 3 4 5 6 ...

微信小程序自定义按钮实现分享功能_js 微信分享功能怎么绑定到按钮上_小破孩呦的博客-程序员秘密

在js文件里边最下方有一个onShareAppMessage函数,在这个函数里边添加分享的内容和路径,如下:/** * 用户点击右上角分享 */ onShareAppMessage: function() { return { title: '在这里输入标题', desc: '在这里输入简介说明', path: '../home/...

二、常见的EDID问题_如何解决显示器edid问题_future_sky_word的博客-程序员秘密

现在的显示器功能很强大,通常都提供多种视频接口,常见的有DVI、VGA、HDMI、DP等,由于每种接口的特性和带宽不同,使得不同接口的EDID也不同。使用哪个接口,PC读到的就是哪个接口的EDID。可能的原因:信号源设备,比如PC的显卡或是笔记本电脑无法读取显示器的EDID信息。可能的原因:信号源设备,比如PC的显卡或是笔记本电脑无法读取显示器的EDID信息。

C++ 洛谷P1230 智力大冲浪_weixin_30539625的博客-程序员秘密

题目描述小伟报名参加中央电视台的智力大冲浪节目。本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元。先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则:首先,比赛时间分为n个时段(n≤500),它又给出了很多小游戏,每个小游戏都必须在规定期限ti前完成(1≤ti≤n)。如果一个游戏没能在规定期限前完成,则要从奖励费m元中扣去一部分钱wi...

EDID解析_chenbang110的博客-程序员秘密

1 InstructionEDID: Extended Display Identification Data(扩展显示标识数据)是一种VESA (Video Electronics Standards Association)标准数据格式,其中包含有关显示器及其性能的参数,包括供应商信息、最大图像大小、颜色设置、厂商预设置、频率范围的限制以及显示器名和序列号的字符串(摘自百度百科“EDID”词条...

随便推点

Python读取xml文档(遍历法_python遍历读取xml文件_ruixue2016的博客-程序员秘密

Python读取xml文档(遍历法) (2010-04-17 15:27:33)转载▼标签: python xml dom 节点 it分类: Python    参考资料《dive into python》    Python读xml文档的方法有多种,这里介绍用dom模块,需要下载PyXML- 0.8.4.win32-py2.5.exe库(我用的python2.5)。    假如我们有个xml文档...

HDMI EDID解读_wowo1109的博客-程序员秘密

现在的显示设备比如显示器,电视等都HDMI接口,那通常每个HDMI接口都保留有一份EDID数据,这个数据可以存在程序里面由系统启动过程中来初始化,更常见的做法是每个HDMI口会有一个EEPROM来保存这份数据,这个EEPROM也只是有256bytes大小。外接设备如DVD播放器在HDMI热插拔的时候就会通过HDMI的DDC通道来读取EDID数据。EDID里面主要是定义了这显示设备所支持的图像分辨率

尝试制作在A20上(CB2)自己的Linux系统_全志a20 刷成linux_Link_Ling的博客-程序员秘密

Linux编译参考文档http://my.oschina.net/u/1982421/blog/304633Uboot学习参考资料http://blog.csdn.net/andy_wsj/article/category/1335685用BusyBox创建文件系统的参考http://www.th7.cn/system/lin/201403/50580.shtml好

DDC EDID 介绍_hello_wyq的博客-程序员秘密

DDC EDID 介绍  <!--google_ad_client = "pub-6952090322455314";google_alternate_ad_url = "http://www.avresearcher.com";google_ad_width = 468;google_ad_height = 15;google_ad_format = "468x1

定义permission, 使用新定义的permission, persist service_dummypersisit_shuai_wen的博客-程序员秘密

AndroidManifest.xml:Declares a security permission that can be used to limit access to specific components or features of this or other applications.            android:icon="drawable

推荐文章

热门文章

相关标签