C++調(diào)用C函數(shù)報錯無法解析的外部命令/無法解析的外部符號問題
C++調(diào)用C函數(shù)報錯無法解析的外部命令/外部符號
話不多說,原因在于extern “C”{} 的添加位置, 小主犯得錯誤是,C++ 中包含的C 的頭文件,沒有包含在 extern “C”{}的花括號,小主只把C++ 中的函數(shù)包含在了其中,把頭文件給忽略掉了。
錯誤
#include "c_header.h"
extern "C"{
?? ?//...
}正確
extern "C"{
#include "c_header.h" // 注意這行代碼的位置
?? ?//...
}有沒有戳中你
關(guān)于“無法解析外部命令”的幾個常見原因
這次接手的項目中生成后遇到了類似問題,經(jīng)過參考排查發(fā)現(xiàn)外部C++文件中extern聲明的函數(shù)類型與原定義的函數(shù)類型不一致。但由于報錯實在奇怪,我也是第一次遇到這種問題,花了整整兩天才將問題解決掉。
無法解析的外部符號的情況發(fā)生原因
1.沒有加入相應(yīng)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.符號定義為靜態(tà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
另外類出常見錯誤:
cannot instantiate abstract class
一是繼承類沒有重寫純虛函數(shù),二是該類是抽象類
本次遇到的問題是最簡單的返回類型錯誤,即在A.cpp中定義了形如:
QString B(DcmDataset* ds, const Tag &tag, QSqlQuery& query, const QString& str, const QVariant& Varient)
{
...
}但在外部文件extern聲明的時候?qū)戝e成:
extern void B(DcmDataset* ds, const Tag &tag, QSqlQuery& query, const QString& str, const QVariant& Varient);
由此導(dǎo)致,此問題在生成之前編譯器(vs2010)是找不出來的,在生成時報的錯也很容易讓人摸不著頭腦。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
解析C++編程中異常相關(guān)的堆棧展開和throw()異常規(guī)范
這篇文章主要介紹了C++編程中異常相關(guān)的堆棧展開和throw()異常規(guī)范,throw()規(guī)范部分文中結(jié)合了C++11標(biāo)準(zhǔn)的新特性來講,需要的朋友可以參考下2016-01-01
探究C++中指針與數(shù)組運(yùn)算符優(yōu)先級
C++中與指針和數(shù)組相關(guān)的運(yùn)算符優(yōu)先級,通過實際代碼示例解釋了運(yùn)算符的左結(jié)合與右結(jié)合方式,以及如何使用圓括號()來改變默認(rèn)的結(jié)合順序,文章還提供了一個優(yōu)先級表,列出了運(yùn)算符的優(yōu)先級和結(jié)合性,幫助讀者更好地理解復(fù)雜表達(dá)式中運(yùn)算符的調(diào)用順序2024-10-10

