C++调用C函数报错无法解析的外部命令/无法解析的外部符号问题

 更新时间:2023年08月02日 09:29:38   作者: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)是找不出来的,在生成时报的错也很容易让人摸不着头脑。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C语言预处理详解

    C语言预处理详解

    这篇文章主要给大家介绍了关于C语言之预处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-10-10
  • C语言数据结构顺序表中的增删改(尾插尾删)教程示例详解

    C语言数据结构顺序表中的增删改(尾插尾删)教程示例详解

    这篇文章主要为大家介绍了C语言数据结构顺序表中的增删改教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • C语言实现电脑关机程序

    C语言实现电脑关机程序

    这篇文章主要为大家详细介绍了C语言实现电脑关机程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C++虚函数表和虚析构介绍

    C++虚函数表和虚析构介绍

    这篇文章主要介绍了C++虚函数表和虚析构,虚函数表是C++实现多态的基础,多态是面向对象的三大特性之一,下面文章我们一起来看看详细内容,需要的朋友可以参考一下
    2021-11-11
  • linux之sort命令的用法

    linux之sort命令的用法

    sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出
    2013-10-10
  • C语言中字符串与各数值类型之间的转换方法

    C语言中字符串与各数值类型之间的转换方法

    这篇文章主要介绍了C语言中字符串与各数值类型之间的转换方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • C语言实现排序算法之归并排序详解

    C语言实现排序算法之归并排序详解

    这篇文章主要介绍了C语言实现排序算法之归并排序,对归并排序的原理及实现过程做了非常详细的解读,需要的朋友可以参考下
    2014-07-07
  • C++并查集算法简单详解

    C++并查集算法简单详解

    大家好,本篇文章主要讲的是C++并查集算法简单详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • Qt中QMapIterator检测是否为空的实现

    Qt中QMapIterator检测是否为空的实现

    本文主要介绍了Qt中QMapIterator检测是否为空的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-10-10
  • C++ 异常处理机制与自定义异常体系处理方式

    C++ 异常处理机制与自定义异常体系处理方式

    本节将详细介绍C++异常处理的相关概念、用法以及如何通过自定义异常体系来满足程序的需求,同时,我们将对比C语言的传统错误处理方式,分析C++异常机制的优缺点,并探讨标准库中提供的异常体系,帮助开发者更好地理解和使用C++的异常处理功能,感兴趣的朋友一起看看吧
    2024-12-12

最新评论