C++调用C函数报错无法解析的外部命令/无法解析的外部符号问题
作者:Jeady5
这篇文章主要介绍了C++调用C函数报错无法解析的外部命令/无法解析的外部符号问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
C++调用C函数报错无法解析的外部命令/外部符号
话不多说,原因在于extern “C”{} 的添加位置, 小主犯得错误是,C++ 中包含的C 的头文件,没有包含在 extern “C”{}的花括号,小主只把C++ 中的函数包含在了其中,把头文件给忽略掉了。
错误
#include "c_header.h" extern "C"{ //... }
正确
extern "C"{ #include "c_header.h" // 注意这行代码的位置 //... }
有没有戳中你
关于“无法解析外部命令”的几个常见原因
这次接手的项目中生成后遇到了类似问题,经过参考排查发现外部C++文件中extern声明的函数类型与原定义的函数类型不一致。但由于报错实在奇怪,我也是第一次遇到这种问题,花了整整两天才将问题解决掉。
无法解析的外部符号的情况发生原因
1.没有加入相应lib库文件.
2.类成员有声明,但没有定义.或者定义与声明不符合.
3.没有包含源文件.例如
extern int i; extern void g(); void f() { i++; g(); } int main() { }
4.符号定义在编译为 C 程序的文件中,而符号是在 C++ 文件中不带 extern "C" 修饰符声明的。
在此情况下,请修改声明,例如不是使用:
extern int i; extern void g();
而使用:
extern "C" int i; extern "C" void g();
同样,如果在将由 C 程序使用的 C++ 文件中定义符号,请在定义中使用 extern "C"。
5.符号定义为静态,但稍后在文件外部被引用。
没有定义静态类成员。例如,应单独定义下面类声明中的成员变量 si:
#include <stdio.h> struct X { static int si; }; // int X::si = 0; // uncomment this line to resolve void main() { X *px = new X[2]; printf("/n%d",px[0].si); // LNK2019 }
6.调用的函数参数输入不正确。2019
另外类出常见错误:
cannot instantiate abstract class
一是继承类没有重写纯虚函数,二是该类是抽象类
本次遇到的问题是最简单的返回类型错误,即在A.cpp中定义了形如:
QString B(DcmDataset* ds, const Tag &tag, QSqlQuery& query, const QString& str, const QVariant& Varient) { ... }
但在外部文件extern声明的时候写错成:
extern void B(DcmDataset* ds, const Tag &tag, QSqlQuery& query, const QString& str, const QVariant& Varient);
由此导致,此问题在生成之前编译器(vs2010)是找不出来的,在生成时报的错也很容易让人摸不着头脑。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。