C++調(diào)用C函數(shù)報(bào)錯(cuò)無(wú)法解析的外部命令/無(wú)法解析的外部符號(hào)問(wèn)題
C++調(diào)用C函數(shù)報(bào)錯(cuò)無(wú)法解析的外部命令/外部符號(hào)
話不多說(shuō),原因在于extern “C”{} 的添加位置, 小主犯得錯(cuò)誤是,C++ 中包含的C 的頭文件,沒(méi)有包含在 extern “C”{}的花括號(hào),小主只把C++ 中的函數(shù)包含在了其中,把頭文件給忽略掉了。
錯(cuò)誤
#include "c_header.h" extern "C"{ ?? ?//... }
正確
extern "C"{ #include "c_header.h" // 注意這行代碼的位置 ?? ?//... }
有沒(méi)有戳中你
關(guān)于“無(wú)法解析外部命令”的幾個(gè)常見(jiàn)原因
這次接手的項(xiàng)目中生成后遇到了類似問(wèn)題,經(jīng)過(guò)參考排查發(fā)現(xiàn)外部C++文件中extern聲明的函數(shù)類型與原定義的函數(shù)類型不一致。但由于報(bào)錯(cuò)實(shí)在奇怪,我也是第一次遇到這種問(wèn)題,花了整整兩天才將問(wèn)題解決掉。
無(wú)法解析的外部符號(hào)的情況發(fā)生原因
1.沒(méi)有加入相應(yīng)lib庫(kù)文件.
2.類成員有聲明,但沒(méi)有定義.或者定義與聲明不符合.
3.沒(méi)有包含源文件.例如
extern int i;? extern void g(); void f() { i++; g(); } int main() { }
4.符號(hào)定義在編譯為 C 程序的文件中,而符號(hào)是在 C++ 文件中不帶 extern "C" 修飾符聲明的。
在此情況下,請(qǐng)修改聲明,例如不是使用:
extern int i; extern void g();
而使用:
extern "C" int i; extern "C" void g();
同樣,如果在將由 C 程序使用的 C++ 文件中定義符號(hào),請(qǐng)?jiān)诙x中使用 extern "C"。
5.符號(hào)定義為靜態(tài),但稍后在文件外部被引用。
沒(méi)有定義靜態(tài)類成員。例如,應(yīng)單獨(dú)定義下面類聲明中的成員變量 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.調(diào)用的函數(shù)參數(shù)輸入不正確。2019
另外類出常見(jiàn)錯(cuò)誤:
cannot instantiate abstract class
一是繼承類沒(méi)有重寫(xiě)純虛函數(shù),二是該類是抽象類
本次遇到的問(wèn)題是最簡(jiǎn)單的返回類型錯(cuò)誤,即在A.cpp中定義了形如:
QString B(DcmDataset* ds, const Tag &tag, QSqlQuery& query, const QString& str, const QVariant& Varient) { ... }
但在外部文件extern聲明的時(shí)候?qū)戝e(cuò)成:
extern void B(DcmDataset* ds, const Tag &tag, QSqlQuery& query, const QString& str, const QVariant& Varient);
由此導(dǎo)致,此問(wèn)題在生成之前編譯器(vs2010)是找不出來(lái)的,在生成時(shí)報(bào)的錯(cuò)也很容易讓人摸不著頭腦。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)順序表中的增刪改(尾插尾刪)教程示例詳解
這篇文章主要為大家介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)順序表中的增刪改教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02C語(yǔ)言實(shí)現(xiàn)電腦關(guān)機(jī)程序
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電腦關(guān)機(jī)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02C語(yǔ)言中字符串與各數(shù)值類型之間的轉(zhuǎn)換方法
這篇文章主要介紹了C語(yǔ)言中字符串與各數(shù)值類型之間的轉(zhuǎn)換方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03C語(yǔ)言實(shí)現(xiàn)排序算法之歸并排序詳解
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)排序算法之歸并排序,對(duì)歸并排序的原理及實(shí)現(xiàn)過(guò)程做了非常詳細(xì)的解讀,需要的朋友可以參考下2014-07-07Qt中QMapIterator檢測(cè)是否為空的實(shí)現(xiàn)
本文主要介紹了Qt中QMapIterator檢測(cè)是否為空的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10