Linux下面的编译和连接

本文详细解释了编译过程如何将源代码转换为对象文件,以及链接过程如何将多个对象文件组合成可执行文件或动态库。介绍了编译时如何处理外部函数引用,并在链接阶段如何解决这些引用的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译和连接:
编译通常是对单个源文件进行编译成.o文件;
要加上-c选项,比如 gcc -o aa.o -c aa.cpp
否则会提示找不到main函数;因为有些模块只是提供单元函数;并没有main函数;
编译只检查基本语法,对于引用的外部函数,只用能找到其声明就可以正确编译通过,比如在cpp文件中包含了引用的外部库函数的头文件等.
 
连接是指把先前编译出来的.o连接成可执行的文件;这时候ld就要找到所有函数和变量的定义和实现;如果引用了外部库函数就要在连接的时候制定要连接的库.这样ld就可以到相应的库里面找到cpp中用到的函数.
 
连接还有一种情况就是把几个.o连接成一个so动态库;
这时候ld也不寻找那些引用的外部库函数;只是简单的连接;
比如要把a.o ,b.o 连接成一个libab.so动态库,其中a.o中用了第三方库libthird.so中的函数;在连接时要用选项-G(solaris下面)活着-shared(linux下面)以表明这是在生成一个库,而不是最终目标;这样ld就不会去检查应用的外部函数是否能找到:gcc -G -o libab.so a.o b.o
如果写成:gcc -o libab.so a.o b.o,连接的时候就会认为要生成最终目标libab.so,从而会去找a.o中用到的第三方库;如果找不到就报错.
所以在连接成最终目标的时候要加入连接选项 -lthird
 
如果一个程序用了上面说的libab.so中的函数,那么在生成最终目标程序时一定要加入这个连接库-lab;而因为libab.so又用到了libthird.so,所以也一定要加入-lthird;否则会提示libab.so中一些符号未定义.
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值