用C呼叫C 函式來看extern C 的作用

2021-08-07 13:11:01 字數 1129 閱讀 3019

extern "c" 這個東西不知道在書上和別人的**裡看到過多少次了,但是就是從來沒有好好了解過,結果有一次專案對接問題就出在了這裡。果然遇到問題才是學習的最好途徑啊!

情況是這樣的:我用c++**寫了大一堆東西,然後我要把自己寫的東西生成乙個動態庫給別人呼叫。但是別人在呼叫的時候,就面臨乙個問題:別人無論是用c語言還是c++語言寫呼叫**,都能成功呼叫嗎?答案是不能。下面做個測試。

測試平台:ubuntu16.04

首先我用c++寫了一堆**,實現了乙個功能,然後這個功能要給別人呼叫,因此我需要把這個功能打包成動態庫.so給別人,除此之外我還需要寫乙個標頭檔案,宣告呼叫的介面函式告訴別人怎麼呼叫。到最後就把這個test.so檔案和api_test.h檔案給別人就好了。

test.so檔案理論上來講是乙個已經封裝過的東西,所以只要第三方的語言支援呼叫.so這種庫檔案,那麼你生成so檔案時用的是c還是c++就無所謂了,只要功能是正確的就行,所以這件事的核心焦點還是在api_test.h這個介面標頭檔案上。下面我們就來看看這個標頭檔案。

我們先從最簡單最本能的地方來看,我的功能是用c++實現的,所以最自然的呼叫當然應該是用c++了,所以我們來寫乙個假設對方用c++時的呼叫介面:

#ifndef _api_test_h_

#define _api_test_h_

double api_test(int a, int b);

#endif

再寫一段呼叫**test_usecpp.cpp:

#include "api_test.h"

#include int main()

然後我們會發現,如果像上面這樣呼叫,是無法呼叫成功的,為什麼呢?看提示的錯誤資訊:

/tmp/ccopdxuw.o: in function `main':

test_usecpp.cpp:(.text+0x18): undefined reference to `api_test(char const*)'

collect2: error: ld returned 1 exit status

提示api_test這個介面函式沒有定義,這就表示找不到介面函式。

C 介面函式(c中呼叫c 函式extern)

一 在c 的標頭檔案中 需要包含 ifdef cplusplus extern c endif在c 的cpp檔案中需要包含該函式的實現 const char dmnmsagentgetfirstpeerid const char dmnmsagentgetnextpeerid 二 在c的.c檔案中對...

C 呼叫C 函式來與串列埠通訊

前些日子幫朋友寫個小軟體,要求用c 來實現主程式,主要的功能是與一些通訊裝置打交道,當然就是通過串列埠了,以十進位制傳送和讀取串列埠 的資料,考慮到c 呼叫api並沒有c 來得方便,因此,我用c 封裝了乙個讀寫串列埠的dll,只提供乙個函式供外部呼叫,這樣的好處在於,c 只要呼叫這個函式傳送完資料後...

C 呼叫C 函式來與串列埠通訊

前些日子幫朋友寫個小軟體,要求用c 來實現主程式,主要的功能是與一些通訊裝置打交道,當然就是通過串列埠了,以十進位制傳送和讀取串列埠 的資料,考慮到c 呼叫api並沒有c 來得方便,因此,我用c 封裝了乙個讀寫串列埠的dll,只提供乙個函式供外部呼叫,這樣的好處在於,c 只要呼叫這個函式傳送完資料後...