编译烂活合集
compile上的烂活,可能导致各类的问题
在头文件定义宏
在头文件定义宏出现重复定义的其实倒还好,如果一个头文件被include,然后恰好在一个translate unit里面,有一个同名的符号,这个符号会被替换
大多数时候可能还好,但出问题就很恶心,要改头文件顺序。工程大了就是折磨
在头文件使用宏
第二种在头文件使用宏,但是有些编译单元里+了这个define,有些没有+,这样在不同的编译单元里,这个宏包裹的部分其实不一样,这种出现的问题就很难找,一般都可能崩的很奇怪
两个静态库依赖同一个静态库导致符号冲突
这个问题在编译器里面是可以解决的,但是在链接器里面就不行了,因为链接器是不知道编译器的信息的
这个问题比较有趣,在Ref-1里可以详细看看
说实话,这种link导致重复的,gcc下,他发现有一摸一样的符号,可能丢弃第二个库,但是vc就会爆冲突,然后如果用到lib里的某个符号,这个目标里的全部符号都会被导入。
但如果两个库稍有不同,且不同的地方被用到了,两个库就里相关的.o就会完全被导入,结果就是符号会冲突
很多人一直觉得编译的知识不是很重要,只要会用cmake之类的工具就行了,虽然确实也是这样,但我更愿意知其所以然
循环依赖
顶级烂活,但是可以处理,但是处理起来很麻烦,强连通,要链接几次。简单点的办法就是start group和end group
debug + release库混用
这个在win下存在比较骚的东西,但我之前比较少遇到(因为我之前也debug用release的库,或者release用debug的库)
这里面讲了一个flag,在win下link的时候如果flag不匹配会报错。一般办错理由是
1
error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in *.lib
这个时候找到混用了的库就行。
混用不同版本的库在不同的组件中
杂谈:一个 C++ Header-only 版本冲突的案例分析
主要看看上面这个,增加点记性,我发现我司的也很多这种问题,只不过现在没爆雷
Ref
This post is licensed under CC BY 4.0 by the author.