c语言函数之间互相调用符号,如何实现C和C++函数互相调用
鏈接庫頭文件:
//head.h
class A
{
public:
A();
virtual ~A();
int gt();
int pt();
private:
int s;
};
.cpp
//firstso.cpp
#include
#include "head.h"
A::A(){}
A::~A(){}
int A::gt()
{
s=10;
}
int A::pt()
{
std::cout<
}
編譯命令如下:
g++ -shared -o libmy.so firstso.cpp
這時候生成libmy.so文件,將其拷貝到系統(tǒng)庫里面:/usr/lib/
進行二次封裝:
.cpp
//secso.cpp
#include
#include "head.h"
extern "C"
{
int f();
int f()
{
A a;
a.gt();
a.pt();
return 0;
}
}
編譯命令:
gcc -shared -o sec.so secso.cpp -L. -lmy
這時候生成第二個.so文件,此時庫從一個類變成了一個c的接口.
拷貝到/usr/lib
下面開始調(diào)用:
//test.c
#include "stdio.h"
#include "dlfcn.h"
#define SOFILE "sec.so"
int (*f)();
int main()
{
void *dp;
dp=dlopen(SOFILE,RTLD_LAZY);
f=dlsym(dp,"f");
f();
return 0;
}
編譯命令如下:
gcc -rdynamic -s -o myapp test.c
運行Z$./myapp
10
$
關于這個文章的一點補充,轉(zhuǎn)至http://blogs.sun.com/lirincy/
這篇blog寫了怎樣用C調(diào)用C++的庫,我試驗了一下,在linux上成功,
有兩個地方要改一下,最后的編譯語句應該是:
gcc -rdynamic -s -o -ldl myapp test.c
還有就是test.c最后應該加上:
dlclose(dp);
否則會CoreDump。
實際上他是把類的方法變成了一個可以外部調(diào)用的C函數(shù),用extern C。
二〉C++程序如何調(diào)用C語言寫的庫,如a.lib等,有對應的庫頭文件a.h。假設a.h中定義了函數(shù):
int WhyCoding(int a, float b);
做法是,
extern "C" {
#include "a.h"
}
或
extern "C" {
int WhyCoding(int a, float b);
}
從上面可以看出,extern "C" 是用在C和C++之間的橋梁。之所以需要這個橋梁是因為C編譯器編譯函數(shù)時不帶
函數(shù)的類型信息,只包含函數(shù)符號名字,如C編譯器把函數(shù)int a(float x)編譯成類似_a這樣的符號,C連接器只要
找到了調(diào)用函數(shù)的符號,就可以連接成功,它假設參數(shù)類型信息是正確的,這是C編譯連接器的缺點。而C++
編譯器為了實現(xiàn)函數(shù)重載,編譯時會帶上函數(shù)的類型信息,如他把上面的a函數(shù)可能編譯成_a_float這樣的
符號為了實現(xiàn)重載,注意它還是沒有帶返回值得信息,這也是為什么C++不支持采用函數(shù)返回值來區(qū)別函數(shù)
重載的原因之一,當然,函數(shù)的使用者對函數(shù)返回值的處理方式(如忽略)也是重要原因。
基于以上,C調(diào)用C++,首先需要用封裝函數(shù)把對C++的類等的調(diào)用封裝成C函數(shù)以便C調(diào)用,于是extern "C" 的
作用是:讓編譯器知道這件事,然后以C語言的方式編譯和連接封裝函數(shù).(通常是把封裝函數(shù)用C++編譯器按C++
方式編譯,用了extern "C" 后,編譯器便依C的方式編譯封裝接口,當然接口函數(shù)里面的C++語法還是按C++方式
編譯;對于C語言部分--調(diào)用者,還是按C語言編譯;分別對C++接口部分和C部分編譯后,再連接就可以實現(xiàn)C
調(diào)用C++了).
相反,C++調(diào)用C函數(shù),extern "C" 的作用是:讓C++連接器找調(diào)用函數(shù)的符號時采用C的方式,即使用_a而不是
_a_float來找調(diào)用函數(shù)。
chai, zheng 1:20 AM, Nov 29, 2006 at nanjing, China
總結(jié)
以上是生活随笔為你收集整理的c语言函数之间互相调用符号,如何实现C和C++函数互相调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言开发游戏趋势,都9012年了,为何
- 下一篇: 最优化评分法c语言,最优化方法及其实现(