C/C++笔记-make编译时需要注意的问题(编译可执行程序时链接的so出现未定义的引用)

文章讲述了在复杂C++项目中,由于makefile的配置策略(使用.sh文件管理头文件和动态库包含,以及宏定义),导致在A机器上编译正常但在B机器上链接时遇到未定义引用的问题,强调了宏定义的一致性对解决此类问题的重要性。

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

背景

环境是这样的,一个复杂的C++项目,本来在A机器上能编译过去的,但放到B机器上编译可执行程序时链接的so出现未定义的引用。这就有点莫名奇妙了。

原因

我这边造成这个现象的原因有以下几点:

① 在makefile中所有的-I(头文件包含)和-L(动态库包含)命令,他们都喜欢放到一个xxx.sh文件中,通过传入不同的参数,可以输出对应的-I和-L。估计是方便其他程序复用,以及对应的makefile看起来简洁美观点。

② 其实就是 ① 的扩展,在makefile中通过-D参数,定义宏,这个就比较关键。了,比如-DMyDefine

在某.h代码中:

#ifndef MyDefine
#define MyFunction(A, B, C) \
        printf(B, C)
#else
#include "xxxx.h"
#endif

问题就来了,在编译so时,makefile中可能定义了对应了宏,而在可执行程序时,没有定义。或者情况和这相反。再加上代码写得比较拉跨。xxxx.h中有大量某函数重载。所以解决的方法,就是编译时so和可执行程序都一致,不要一个定义了宏,一个没定义宏。

总结

一般开源的so兼容性相当好,基本上不会出现上面的问题,自定义的so很有可能会出现。所以解决办法,还得去看makefile文件,和报错的地方,多少个参数,并且是在哪个地方定义的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值