1. 程式人生 > >研究了一下關於c/c++編譯器關於匯出函式的不同處理

研究了一下關於c/c++編譯器關於匯出函式的不同處理

剛剛我在用試驗ffmpeg解碼庫解碼視訊檔案的時候,寫好了但是提示連結錯誤,就網上找了一些文章,現在總結一下,如有錯誤或不嚴謹的地方請告之,免得我坑害別人,先謝過了!

總所周知,c++相容c,但是在c++中呼叫純c寫的庫時,編譯連結目標檔案的時候回提示找不到識別符號,這是因為c++支援過載和多型的而c不支援的緣故.所謂過載就是函式名相同而引數個數或者引數型別不同,c++編譯器在處理這個問題的時候是把函式名寫成函式名+引數型別的形式,比如:int sum(int,int);c++編譯器編譯在符號表的名字是_sum_int_int(過載和多型其實就是編譯器幫了個小忙),  而c編譯器編譯在符號表中的函式名是_sum;所以在C++專案中呼叫純C庫匯出的函式時會編譯連結目標檔案時錯誤提示找不到函式,因為C編譯器匯出的符號不帶引數型別資訊,而C++編譯器在連結時是按照有引數型別的名字來找函式的,所以LINK:error.

解決這個問題的方法一是在庫標頭檔案的匯出函式宣告前加extern "C",在C++專案中編譯連結的時候,編譯器會根據C的函式符號規則去找函式.
方法二不改庫,在C++專案中載入標頭檔案的#include語句用extern "C"{}的花括號包起來,這樣C++編譯器也會以C的規則生成函式符號去找函式進行連結.
extern "C"也不可亂用,比如你用他包住一個全域性變數和一個類的宣告,而類中一個成員變數和全域性變數重名,普通情況下這樣做是沒有問題的,那是因為按照C++的編譯規則會把同名成員變數在符號庫中的名字是 "類名.變數名"這種形式的,而加上extern "C"之後編譯符號庫中的名字就會是 "變數名",全域性變數在符號庫中的名字也是"變數名",此時重複了產生編譯錯誤.

相關推薦

研究一下關於c/c++編譯器關於匯出函式不同處理

剛剛我在用試驗ffmpeg解碼庫解碼視訊檔案的時候,寫好了但是提示連結錯誤,就網上找了一些文章,現在總結一下,如有錯誤或不嚴謹的地方請告之,免得我坑害別人,先謝過了! 總所周知,c++相容c,但是在c++中呼叫純c寫的庫時,編譯連結目標檔案的時候回提示找不到識別符號,這是因

C/C++ mysql模組匯出函式供lua使用

因為lua是指令碼語言,所以在處理IO和高密度計算的時候效率會低,通常就會把這類高計算函式用C/C++編寫匯出給lua使用,這裡是使用tolua++來實現的 tolua++需要引用的標頭檔案 #ifdef __cplusplus extern "C"{ #endif #

ci框架的controller呼叫 公用函式研究一下

如題吧,今天使用ci做後臺業務的時候,想封裝一個公用函式,方便整個模組呼叫,發現了一個比較快捷的方法:之前就一貫思維,model只寫與資料庫的互動,後來發現原來可以把公用的封裝好的函式放到這裡的!!!!!,然後controller那邊呼叫(因為不推薦呼叫controller呼

python呼叫C動態庫匯出函式的返回值為指標型別時,在64位python環境下被截斷解決方法

          class my_void_p(c_void_p):               pass                      def sslog_create_instance():               #直接指定 restype=c_void_p在64位上還是會發生地址截

美工沒時間給圖,簡單的圖讓我們自己寫,哭啊! 所以具體研究一下shape的使用,保存下

其它 結束 get alt 屬性 width drawable 樣式 ref 在drawable文件夾中創建一個shape的資源文件,其中shape有四個屬性(rectangle、oval、line、ring) 這四個屬性是用來定義圖形的形狀對應(矩形、橢圓、線、圓環) 除

研究一下SGI STL的記憶體演算法

原理在STL原始碼剖析中已經有闡述,這裡簡單的說一下,該記憶體池採用HASH-LIST資料結構管理資料,分配一塊記憶體時,如果所要求的記憶體超過了某個數量就直接呼叫malloc分配記憶體, 否則首先進行資料對齊,根據這個對齊的結果得到所在的HASH表,在該HASH-LIST中查詢時候存在可用的節點,如

Shiro 專案開發中第一次使用到,所以研究一下,這裡

專案使用的是Maven  首先要在pom.xml中引入shiro依賴 <!-- shiro 許可權 --> <dependency> <groupId>org.apache.shiro</groupId> &

研究一下CSDN 私信的排序,我也是醉

一直感覺CSDN的通知和私信總是看起來怪怪的,主頁提示有私信,開啟卻看不到,有時候向後翻幾頁又能看到。 今天又遇到這種情況了,於是研究了一下,剛開始還是沒找到規律,直到看到“3天前”的訊息排在最後一個“3年前”的訊息之後,突然就明白了,於是翻到最開始,發現“1

研究一下 Webpack 打包原理,順手掙個 AirPods Pro

這些年,Webpack 基本成了前端專案打包構建的標配。關於它的原理和用法的文章在網上汗牛充棟,大家或多或少都看過一些。我也一樣,大概瞭解過它的構建過程以及常用 loader 和 plugin 的配置、效能優化方法等等,僅限於“面試夠用”的程度。在實際工作中,往往是配置好後就放一邊了,沒有遇到問題是不會再碰它

整理一下淺墨大神的Visual C++/DirectX 9.0c的遊戲開發手記

billboard 地形 骨骼 之路 四十七 tail 查找 -c AI 還是非常棒的博客,只是沒有一個文件夾。所以自己做了一個山寨文件夾在這裏。便於隨時查找。前面

C/C++編譯器教程之如何安裝vs,看的人應該都會裝,只要不手殘

什麽 dia color tps image spa pad 開始 有一個 這很簡單,其實我覺得不用教,但是吧,你們總有很多問題,所以,就有了這個安裝教程。以上是廢話。首先下載vs編譯器得相關文件就是這兩個文件,上面的txt和下面的iso文件對的,先下載,然後,下載完成之

c++ dll匯出函式返回false值C#卻認為是true的處理方法

轉發網址https://stackoverflow.com/questions/1792581/c-from-c-c-function-in-a-dll-returning-false-but-c-sharp-thinks-its-tr 在C++中宣告匯出函式 bool Foo()

sort函式的用法(C++排序庫函式的呼叫)對陣列進行排序,在c++中有庫函式幫我們實現,這們就不需要我們自己來程式設計進行排序

對陣列進行排序,在c++中有庫函式幫我們實現,這們就不需要我們自己來程式設計進行排序了。 (一)為什麼要用c++標準庫裡的排序函式 Sort()函式是c++一種排序方法之一,學會了這種方法也打消我學習c++以來使用的氣泡排序和選擇排序所帶來的執行效率不高的問題!因為它使用

手把手教你做一個 C 語言編譯器(6):函式定義

由於語法分析本身比較複雜,所以我們將它拆分成 3 個部分進行講解,分別是:變數定義、函式定義、表示式。本章講解函式定義相關的內容。 本系列: EBNF 表示 這是上一章的 EBNF 方法中與函式定義相關的內容。 C

Node.js在跑Express的時候有個時候會卡住按一下Ctrl+C又好的解決辦法

Node.js編寫了一個基於Express的Web應用,但是有的時候這個應用會卡死。 後來發現原因是我使用了Windows原生的命令列,會出現這個問題。 也就是說我是在資料夾下面Shift+滑鼠右鍵,開啟PowerShell執行的我的主程式node app.js啟動的。 解決辦法是: 安裝一個Git客戶端,

C++摒棄C中的realloc()函式

在C語言中,realloc()函式可以改變已分配記憶體區的大小。但是在C++中並不提供類似功能的函式。 如果你需要,你當然可以使用realloc()。但是,realloc()僅僅保證能工作於這樣的陣列之上:它們被malloc()(或者類似的函式)分配,包含一些沒有使用者定義

C++中,編譯器會預設提供的建構函式有哪幾種? C++中預設建構函式有幾種,詳細描述每一種。

答:         只有一種,預設建構函式。(不帶引數的建構函式) 答: 兩種:         1.不帶有任何引數的建構函式。比如 Example();如果使用者沒有定義任何建構函式,則編譯器會

C庫提供三個讀取字串的函式:gets( ) fgets( ) scanf( )。

C庫提供了三個讀取字串的函式:gets( )  fgets( )  scanf( )。 gets()---get string 從系統的標準輸入裝置(通常是鍵盤)獲得一個字串。因為字串沒有預定的長度,所以gets()需要知道輸入何時結束。解決辦法是在讀字串直到遇到一個換行符(/n),按回車鍵可以產生這個字元

linux中讀取網絡卡資訊(ip, mask, mac)以及判斷物理網線是否插好的C程式---我親自試一下,還不錯!

      說明: 我主要轉載如下兩篇文章, 但本文中加入了自己的一些描述       轉載地址一:http://blog.chinaunix.net/uid-20692625-id-3172833.html       轉載地址二:http://blog.chinaun

VS2015用C++建立的動態庫匯出函式名亂碼原因分析

        在上一篇部落格【在VS2015中用C++建立動態庫並用C#呼叫】中提到,在C# DllImport匯入C/C++編寫的動態庫時函式,要加上CallingConvention = Ca