1. 用c語(yǔ)言寫(xiě)動(dòng)態(tài)庫:
//宏--如果定義c++;這里用來(lái)為c++加載c函數 ,以下是詳細解釋?zhuān)?/div>
時(shí)常在cpp的代碼之中看到這樣的代碼:
#ifdef __cplusplus
extern "C" {
#endif
//一段代碼
#ifdef __cplusplus
}
#endif
這樣的代碼到底是什么意思呢?首先,__cplusplus是cpp中的自定義宏,那么定義了這個(gè)宏的話(huà)表示這是一段cpp的代碼,也就是說(shuō),上面的代碼的含義是:如果這是一段cpp的代碼,那么加入extern "C"{和}處理其中的代碼。
要明白為何使用extern "C",還得從cpp中對函數的重載處理開(kāi)始說(shuō)起。在c++中,為了支持重載機制,在編譯生成的匯編碼中,要對函數的名字進(jìn)行一些處理,加入比如函數的返回類(lèi)型等等.而在C中,只是簡(jiǎn)單的函數名字而已,不會(huì )加入其他的信息.也就是說(shuō):C++和C對產(chǎn)生的函數名字的處理是不一樣的. 目的就是主要實(shí)現C與C++的相互調用問(wèn)題。
c.h的實(shí)現
#ifndef _c_h_
#define _c_h_
#ifdef __cplusplus
extern "C" {
#endif
void C_fun();
#ifdef __cplusplus
}
#endif
#endif
-----------------------------------
c.c的實(shí)現
#include "c.h"
void C_fun()
{
}
------------------------------------
在cpp.cpp中調用c.c中的C_test()
cpp.cpp的實(shí)現
#include "c.h"
int main()
{
C_fun()
}
其中__cplusplus是C++編譯器的保留宏定義.就是說(shuō)C++編譯器認為這個(gè)宏已經(jīng)定義了.
所以關(guān)鍵是extern "C" {}
extern "C"是告訴C++編譯器件括號里的東東是按照C的obj文件格式編譯的,要連接的話(huà)按照C的命名規則去找.
==========================
那么C中是如何調用C++中的函數cpp_fun()呢?
因為先有C后有C++, 所以只能從C++的代碼中考慮了.
加入C++中的函數或變量有可能被C中的文件掉用,則應該這樣寫(xiě),也是用extern "C"{}
不過(guò)是代碼中要加,頭文件也要加,因為可能是C++中也調用
--------------------------------------
cpp.h的實(shí)現
#ifndef _c_h_
#define _c_h_
#ifdef __cplusplus
extern "C" {
#endif
void CPP_fun();
#ifdef __cplusplus
}
#endif
#endif
.-------------------------------------------
Cpp.cpp的實(shí)現
extern "C" { //告訴C+++編譯器,擴號里按照C的命名規則編譯
void CPP_fun()
{
.....
}
總結
C和C++對函數的處理方式是不同的.extern "C"是使C++能夠調用C寫(xiě)作的庫文件的一個(gè)手段,如果要對編譯器提示使用C的方式來(lái)處理函數的話(huà),那么就要使用extern "C"來(lái)說(shuō)明。
#ifdef __cplusplus
extern "C"
{
#endif
int add(int x, int y);
#ifdef __cplusplus
}
#endif
/*
* libsthc.c
* Implementation of function add declared in libsthc.h//實(shí)現已經(jīng)聲明的函數
* in c language
*/
#include "libsthc.h"
int add(int x, int y)
{
return x + y;
}
#makefile
libsthc.so:libsthc.o
gcc -shared libsthc.o -lc -o libsthc.so
libsthc.o:libsthc.c libsthc.h
gcc -fPIC -c libsthc.c -o libsthc.o
all:libsthc.so
clean:
rm -f *.o *.so
make完成后,會(huì )生成一個(gè)動(dòng)態(tài)庫,即libsthc.so。為了使其他程序也可以使用該動(dòng)態(tài)庫,需要將庫文件libsthc.so拷貝到/usr/lib目錄下(由于權限的問(wèn)題,一般要以root的身分進(jìn)行拷貝),為了使其他程序也可以使用該動(dòng)態(tài)庫,需要將頭文件libsthc.h拷貝到/usr/include目錄下(由于權限的問(wèn)題,一般要以root的身分進(jìn)行拷貝)。
本文出自 “人生得意須盡歡” 博客,請務(wù)必保留此出處http://no001.blog.51cto.com/1142339/346036