2 c 呼叫 c++ 庫
3 關於 extern 「c」
c++ 是 c 的超集,由於 c++ 具有函式過載等語法特性,使得編譯器在進行 c++ 編譯時與 c 的編譯規則上有所不同。比如為了支援過載,編譯器編譯c++程式時要對函式名進行「重新命名」,新增字尾的方式(字尾由引數的簡寫構成)以區別過載的函式。而編譯器在編譯 c 程式時,函式名不會改動。正是由於在函式名的「翻譯規則」的不同導致 c++ 程式不能直接呼叫 c 編譯生成的庫檔案,否則,會出現「undefined reference」。
c++ 呼叫 c 庫比較簡單,按照如下方法:
檔案結構:
將addint.c, addfloat.c封裝成庫,在main.cpp中呼叫
main.cpp:
#include
#include
extern
"c"class test
test
(int a,
int b,
float c,
float d)
~test()
};intmain()
makefile:
main:
gcc -fpic -c addint.c
gcc -fpic -c addfloat.c
ar -rcs libadd.a addint.o addfloat.o
gcc -shared -fpic -olibadd.so addint.o addfloat.o
g++ main.cpp -omain -ladd -l.
.phony: clean
clean:
rm -rf *.o *.so *.a main
c 呼叫 c++ 庫比較麻煩,必須編寫乙個介面檔案。
具體方法:
介面檔案格式:
#include
"addclass.h"
#ifdef __cplusplus
extern
"c"#ifdef __cplusplus
}#endif
檔案結構:
main.c:
/***************main.c********************/
#include
extern
intaddint
(int
,int);
intmain
(int argc,
char
** argv)
cpp2c.cpp:
/*****************cpp2c.cpp***************/
#include
"addclass.h"
#ifdef __cplusplus
extern
"c"#ifdef __cplusplus
}#endif
addclass.h:
/******************addclass.h***************/
#ifndef __add_h__
#define __add_h__
class add
;#endif
addclass.cpp:
/******************addclass.cpp*************/
#include
"addclass.h"
add:
:add
(int a,
int b)
add::~
add(
)int add:
:getsum()
makefile:
cflags=-imy_lib/include -iinclude -fpic
main:
g++ $(cflags) -c my_lib/src/addclass.cpp
g++ $(cflags) -c src/cpp2c.cpp
gcc $(cflags) -c src/main.c
ar -rcs libadd.a addclass.o cpp2c.o
gcc $(cflags) -shared -olibadd.so addclass.o cpp2c.o
gcc $(cflags) main.o -o$@ -ladd -lstdc++ -l.
.phony:clean
clean:
rm -rf *.o *.a *.so main
extern 「c」 作用:一般出現在 cpp 檔案中,並使用g++編譯。告訴g++編譯器其中宣告的函式和變數採用c的編譯規則進行編譯。
extern 詳細解釋參考:
c與c 混合程式設計
在純c的系統中使用c 的類出現了編譯錯誤!程式 begin mymain.c include thesocket.h void main int argc,char argv end mymain.c begin thesocket.h class thesocket end thesocket.h...
c與c 混合程式設計
1.引言 c 語言的建立初衷是 a better c 但是這並不意味著c 中類似 c語言的全域性 變數和函式所採用的編譯和連線方式與c語言完全相同。作為一種欲與c相容的語言,c 保留了一部分過程式語言的特點 被世人稱為 不徹底地物件導向 因而它可以定義不屬於任何類的全域性變數和函式。但是,c 畢竟是...
C與C 混合程式設計
c 是在 c 語言的基礎上發展起來的。在某種程度上,我們可將 c 看做 c 的一種擴充套件。在本質上,二者的資料型別和函式呼叫慣例都是一致的,因此 c 與 c 混合編譯也是很自然的事情。二者的區別僅在於編譯後函式的名字不同 c 簡單地使用函式名而不考慮引數的個數或型別,而 c 編譯後的函式名則總是將...