C&C++系统,经常遇到要多系统继承的情况,比如把一个第三方库引入到一个现有系统中,或者集成几个现有库,有些时候,我们发现编译和链接会发生一些莫名奇妙的问题,下面把遇到的问题给于总结:
1. 编译错误
(1)头文件没找到
这种情况解决起来比较简单,先确定系统里到底没有引用到的头文件,有的话再确定编译器是否能找到头文件所在的路径。
(2)类型、变量或者函数未声明
有两种情况:
A. 有多个同名头文件,结果编译器首先找到的并不是实际需要的
解决办法就是:把需要的头文件路径放在前边
B. 引用到了正确的头文件,而且明明就是声明了或者定义了,还是说没找到
问题很可能就是出在了条件编译上,某些编译环境定义的宏挡住了真正的定义,可用#error "Msg" 测试到底编译器处理没处理定义部分,打开宏即可
2. 链接错误
编译错误一般就是符号没找到,有两大类情况:
(1). 确实没有定义符号
这个需要添加了,没什么其他办法
(2). 确实定义了符号,链接还是说找不到,有三种情况:
A. 条件编译挡住了函数定义
可以看下编译器是否编译到了需要的接口
B. nm类似的命令可看是否有符号定义,这种情况下最有可能的原因是.o文件重名了,可看下符号具体所在的源文件名,修改至不重名即可.
C. C++调用C函数时候,会默认认为是需要命名转换的,比如Revert接口,C++会调用_zxyRevert_sjX3类似的接口,但是相应的C源码被编译后,生成的符号是_Revert,这时候
需要把C++中引用到的C接口,用extern "C"声明下即可,这也是extern "C"的作用了.
综上,需要注意的是,C++引用C接口、头文件重名、源文件重名,经常会带来莫名其妙的问题,需要加以注意!