C 模組呼叫 C 編寫模組

2021-09-30 04:30:06 字數 1618 閱讀 8502

c

模組呼叫

c++

編寫模組

涉及知識點

1: #ifdef  __cplusplus

extern "c"

處理其中的**。

要明白為何使用extern "c" ,還得從cpp 中對函式的過載處理開始說起。在c++ 中,為了支援過載機制,在編譯生成的彙編碼中,要對函式的名字進行一些處理,加入比如函式的返 回型別等等. 而在c 中,只是簡單的函式名字而已,不會加入其他的資訊. 也就是說:c++ 和c 對產生的函式名字的處理是不一樣的. 目的就是主要實現c 與c++ 的相互呼叫問題。2:

標頭檔案以及

.cpp

檔案。 在

c++

中,包含了標頭檔案,就可以呼叫對應的

.cpp

檔案中的函式,

前途是在對應的

.cpp

檔案中包含該標頭檔案。

最近專案中所犯得錯誤,

乙個模組用

c++ 寫的,

想要在c

中呼叫該

c++

模組,所以提供了乙個標頭檔案(

inte***ce.h, inte***ce.cpp

),在標頭檔案中用

(inte***ce.h)

#ifdef  __cplusplus

extern "c" {

#endif

等做了處理,

並且將該

c++

模組編譯成了乙個庫,在呼叫的時候怎麼都找不到函式定義。

最後發現提供的介面是包含了

extern 「c

」,在inte***ce.cpp  

檔案中卻沒有包含標頭檔案

inte***ce.h ,將該

c++

模組編譯成動態庫的時候是能夠編譯成功,

但是在外界

c 模組呼叫的時候卻發現找不到

inte***ce

中提供的介面函式。

原因就是沒有在

inte***ce.cpp

中加inte***ce.h 

,所以在標頭檔案中是按照

c 編譯器編譯的,但是在

inte***ce.cpp

中是按照

c++

編譯的。當然找不到了,

還有另外的一種防止錯誤,

在inte***ce.cpp

中新增

#ifdef  __cplusplus

extern "c" {

#endif

這樣,即使忘記新增

inte***ce.h

標頭檔案,

同樣可以成功編譯。

3:動態庫的呼叫

在板子上面經常看見

*.so  unloaded

等錯誤提示。

通常情況是提供的動態庫路徑沒有新增到

ld_library_path

環境變數中去,

所以要呼叫

export ld_library_path= $ld_library_path:/lib/path

當然還有其他新增庫路徑的方法。

4:還有其他方法。 參考

參考

c編寫Python模組

附 為何要編寫c擴充套件 保護核心 解決效能瓶頸 建立c一些特有的東西 環境 linux 13.9 300.fc27.x86 64 python 3.6.3 開始 目標 這次我麼來實習製作python3的擴充套件,實現兩個功能 求乙個整數的絕對值 求乙個字串的逆序 用c實現這個功能 int my a...

模組編寫與呼叫

lua允許我們編寫自定義模組以便後面呼叫,在編寫模組之前我們先認識2個知識點 1.lua語言中陣列,模組其實都是table 2.在之前的lua基本語法裡我們知道函式是可以賦值給變數的 構建的函式新增到模組中,好幾種方法 先構建函式,再新增到模組中 直接構建模組函式方法。這種方法下有各種實現方法。區域...

C 呼叫Python模組

當下,c 與python都是比較熱門的計算機程式語言,他們各有優缺點,如果能讓他們互相配合工作,那是多麼美好的事情,今天我來講解一下如何利用c 來呼叫python。如果讓c 支援呼叫python模組,我們首先需要安裝一些擴充套件,這裡推薦使用ironpython庫。第二步,我們新建乙個c 窗體專案,...