1. 程式人生 > >C專案如何轉C++專案——error LNK2019: 無法解析的外部符號 "unsigned int __cdecl

C專案如何轉C++專案——error LNK2019: 無法解析的外部符號 "unsigned int __cdecl

實驗的時候,需要呼叫的庫是C++版本,而進行操作的源專案是C版本,這個時候就需要將C版本的專案轉化為C++。
C語言專案轉化為C++專案還是比較簡單的。

步驟:

  1. 把需要修改的.c 檔案直接改成 .cpp。
  2. 針對.cpp的報錯進行一一修改,基本是記憶體分配是型別轉化問題,解決方法:強制型別裝換; 還有一類是函式符號無法解析。解決方案及舉例如下:

錯誤 79 error LNK2019: 無法解析的外部符號 “unsigned int __cdecl
FLAC__replaygain_synthesis__apply_gain(unsigned char *,int,int,int
const * const * const,unsigned int,unsigned int,unsigned int,unsigned
int,double,int,int,struct DitherContext

分析:這個問題原因是CPP檔案呼叫了C檔案裡面的函式,而C檔案編譯時對函式的處理與CPP不同。

  1. C編譯器的函式名修飾規則
    對於__stdcall呼叫約定,編譯器和連結器會在輸出函式名前加上一個下劃線字首,函式名後面加上一個“@”符號和其引數的位元組數,例如[email protected]__cdecl呼叫約定僅在輸出函式名前加上一個下劃線字首,例如_functionname.
  2. C++編譯器的函式名修飾規則
    C++的函式名修飾規則有些複雜,但是資訊更充分,通過分析修飾名不僅能夠知道函式的呼叫方式,返回值型別,引數個數甚至引數型別。不管__cdecl,__fastcall還是__stdcall呼叫方式,函式修飾都是以一個“?”開始,後面緊跟函式的名字,再後面是引數表的開始標識和按照引數型別代號拼出的引數表。對於__stdcall方式,引數表的開始標識是“@@YG”,對於__cdecl方式則是“@@YA”

所以問題就變成了:C++如何呼叫C函式?
解決方法:

a. 編寫一個C++風格的標頭檔案,在這裡新增extern修飾符。在不修改源C檔案的情況下,最優的處理。

// CStack.h  
extern "C" {  
#include "Stack.h";  
}  

b. 在C標頭檔案中加上extern修飾符。

extern "C" {  
void DeleteStack(Stack stack);  
void PrintStack(Stack stack);  
void Pop(Stack stack);  
}  

以上。
總結來講,C轉C++專案,基本沒有難度,分析清楚具體原因,具體應對即可,能儘量使用.c 原始檔,就直接cpp呼叫c,這樣子的改動量最小。

相關推薦

C專案如何C++專案——error LNK2019: 無法解析外部符號 "unsigned int __cdecl

實驗的時候,需要呼叫的庫是C++版本,而進行操作的源專案是C版本,這個時候就需要將C版本的專案轉化為C++。 C語言專案轉化為C++專案還是比較簡單的。 步驟: 把需要修改的.c 檔案直接改成 .cpp。 針對.cpp的報錯進行一一修改,基本是記憶體

C++控制檯專案中使用C工程程式碼時的注意,避免出現error LNK2019: 無法解析外部符號

當我們在寫 C++控制檯專案時候,有時用到一些執行緒的演算法程式碼專案,這些程式碼專案是用c寫的。當使用時,需要在c的標頭檔案中標註如下內容,才能使得cpp檔案能夠編譯使用c的函式等,才避免在編譯時候出現error LNK2019: 無法解析的外部符號###,在_main中

C++】error LNK2019: 無法解析外部符號

轉:C++ error LNK2019: 無法解析的外部符號 錯誤解決方案 今天在實現類模板特例化的時候遇到一個問題,就是把類模板函式實現放到類的cpp檔案中,然後在main函式中使用這個類的時候,就會出現無法解析的外部符號:函式名(xxxx)等錯誤,那麼出現這個錯誤的原因是什麼呢? 原

C++】error LNK2019: 無法解析外部符號 [email protected

原因:c語言執行時找不到適當的程式入口函式 解決:對於控制檯應用程式 1.選單中選擇 Project->Properties, 彈出Property Pages視窗 2.在左邊欄中依次選擇:Configuration Properties->C/C++->

Visual Studio 2013 C++ 呼叫mysql錯誤 error LNK2019: 無法解析外部符號
error LNK2019: 無法解析外部符號C++程式設計出現問題的解決辦法)

今天,練習程式設計時,照著書本敲程式碼,居然出現了問題,太詭異了。而且出現的是:error LNK2019: 無法解析的外部符號 這樣詭異的問題,著實困擾了我10分鐘。然後我找到了解決辦法——補充預設不帶引數的建構函式的函式體。 ####################

C++ error LNK2019: 無法解析外部符號 錯誤解決方案

今天在實現類模板特例化的時候遇到一個問題,就是把類模板函式實現放到類的cpp檔案中,然後在main函式中使用這個類的時候,就會出現無法解析的外部符號:函式名(xxxx)等錯誤,那麼出現這個錯誤的原因是什麼呢?原因就是現在的編譯裡不支援模板函式的申明和實現分開,要像上面那樣使用

C++的error LNK2019: 無法解析外部符號編譯錯誤

1>Proxy.obj : error LNK2019: 無法解析的外部符號 [email protected],該符號在函式 "public: enum ProxyStatus __thiscall CProxy::ConnectProxyServer(u

C++】error LNK2019: 無法解析外部符號 "public: void __thiscall

出現這個錯誤,應該首先檢視“#include”語句是否包含,或者是否包含正確。符號無法解析意味著編譯器知道有這個符號存在,也就是有宣告,但在連結時,找不到實現程式碼,那麼就去看看報錯的這個函式有沒有實現程式碼。如果它們的確已經有了,還是出現這個錯誤,就把它們重新編譯一下。

專案生成出現問題:error LNK2019: 無法解析外部符號 __imp___vsnprintf

今天在專案生成時遇到了問題:error LNK2019: 無法解析的外部符號 __imp___vsnprintf… 幸好發現stackoverflow有人回答了這個問題http://stackoverflow.com/questions/29556290/ra

[]MSVCRTD.lib(crtexew.obj) : error LNK2019: 無法解析外部符號
error LNK2019: 無法解析外部符號;fatal error LNK1120: 1 個無法解析外部命令; 可能存在的問題

alt 配置 pan ron ima detail deb 16px 管理 一、問題:使用一個.lib出現如下錯誤 (我使用的環境 vs2012)   error LNK2019: 無法解析的外部符號 _SSL_CTX_new,該符號在函數 _main 中被引用;   fa

c++連接mysql數據庫出現無法解析外部符號的問題

vs、解析外部符號include,lib文件夾都已經拷到了項目根目錄,並且設置好了路徑,生成就會出現無法解析的外部符號,提示我無法轉到函數的定義,最後發現vs2017默認win32,但是我的程序集64位的。更改後,重新設置目錄,路徑即可。c++連接mysql數據庫出現無法解析外部符號的問題

錯誤 1 error LNK2019: 無法解析外部符號 "public: __thiscall Distance::Distance(int)" (??0Distance@@QAE@H@Z),該符號在函數 _main 中被引用

his 無法 析構函數 this distance AI sta 語法 解析 錯誤: 錯誤 1 error LNK2019: 無法解析的外部符號 "public: __thiscall Distance::Distance(int)" (??0Distance@@QAE@

Qt error: LNK2019: 無法解析外部符號 解決

按照以下幾個步驟依次執行: 1、確認導包是否正確,尤其自定義的檔案; 2、構建-->清理專案,然後執行 qmake; 3、是否有槽函式宣告,卻沒有實現或刪除; 4、自定義類時,建構函式或者解構函式沒有實現; 特別一點的 5、是否需要修改pro檔案。例如: 使用QPr

error LNK2019-無法解析外部符號 _main-該符號在函式 ___tmainCRTStartup 中被引用

問題分析: 因為Win32 console Application的入口函式是Main(),而Win32 Application的入口函式才是WinMain() 解決方案: 右鍵專案,開啟【屬性】頁,【配置屬性】——【連結器】——【系統】中的【子系統】改為【視窗 (/SUBSYSTEM:WINDOWS)