1 declaration of **** shadows a parameter”
主要是重定义
2 does not name a type
主要有以下原因:
a 引用的类命名空间未包含
b 引用的类头文件未包含
c 包含了头文件,或者已经前置声明了,则说明所引用的类名写错。
d 循环引用头文件
3 undefined reference to (找不到声明)快速排查
Case 1, 链接时缺少定义了XXX的源文件或者目标文件或者库文件
- 1.1 缺源文件。
- 1.2 缺目标文件。
- 1.3 缺库文件。
Case 2, 链接顺序不对
多个库文件链接顺序问题。
或者是存在嵌套:链接的库文件中又使用了另一个库文件
Case 3, 函数符号修饰不一样
- 3.1 函数定义和声明不一致。
- 3.2 C和C++混合编程(在c++代码中链接c语言的库)。
解决方案,加上extern "C"处理为模块,就可以了。
3.3 编译器版本或者编译器选项不一致。
Case 4,把模板函数写进了cpp文件中
Case 5,api hinden
这种情况常见于一些开源库里面的不兼容,前面的版本这个api是可以用的,库升级后,这个版本变成了hinden了。
4 extern "C " c/c++混编
使用C++ 混编的原因:
在C++代码中调用C语言的函数或变量:当在C++代码中调用C语言的函数或变量时,需要在函数或变量的声明前添加extern "C"关键字,以指定使用C语言的命名和调用约定。这样可以避免C++的函数重载和参数类型检查机制对函数或变量的名称进行修改,从而保证能够正确地找到对应的函数或变量定义。
在C语言代码中调用C++的函数:当在C语言代码中调用C++的函数时,由于C语言不支持函数重载和参数类型检查机制,因此需要使用extern "C"关键字来指定使用C语言的命名和调用约定。同时,需要注意在C++代码中定义的函数中不能使用C语言不支持的特性,如C++的类和虚函数等。