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

背景

环境是这样的,一个复杂的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文件,和报错的地方,多少个参数,并且是在哪个地方定义的.

相关推荐

  1. c编译执行

    2024-03-28 14:58:03       54 阅读
  2. MySQL调优需要注意问题

    2024-03-28 14:58:03       40 阅读
  3. 编写HTML文件注意事项

    2024-03-28 14:58:03       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-28 14:58:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-28 14:58:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-28 14:58:03       82 阅读
  4. Python语言-面向对象

    2024-03-28 14:58:03       91 阅读

热门阅读

  1. 蓝桥集训之子矩阵

    2024-03-28 14:58:03       41 阅读
  2. spring boot的小数位丢失.00 或者.0

    2024-03-28 14:58:03       37 阅读
  3. 面试 JVM 八股文十问十答第五期

    2024-03-28 14:58:03       45 阅读
  4. node.js常用命令

    2024-03-28 14:58:03       43 阅读
  5. Popup

    2024-03-28 14:58:03       43 阅读
  6. IDEA调优

    2024-03-28 14:58:03       41 阅读
  7. 【服务器】常见服务器高危端口

    2024-03-28 14:58:03       45 阅读
  8. Vue常用命令

    2024-03-28 14:58:03       37 阅读