c语言调用c++函数

c语言通过动态链接库调用c++函数c++调用c函数是比较简单的,但c调用c++函数则要麻烦一些,除了用动态链接库,我暂时也没有找到其它方法.

// vector.cpp:

#include <vector>
#include <string>

using namespace std;

extern "C"
{

void vector_add_string(char* str);
void vector_list_strings(char* buff);

vector<string> _stringList;

void vector_add_string(char* str)
{
_stringList.push_back( string(str) );
}

void vector_list_strings(char* buff)
{
int len=0;

for( vector<string>::iterator it=_stringList.begin();it!=_stringList.end();++it)
{
strcpy( buff+len,(*it).c_str());
len+=it->length();
}
}

}

编译程动态链接库:
g++ -shared -o vector.so vector.cpp

// test.c

#include "stdio.h"
#include "dlfcn.h"

void (*add)(char*);
void (*list)(char*);

int main(void)
{
char buff[1024];

void *dp;
dp=dlopen("./vector.so",RTLD_LAZY);

add=dlsym(dp,"vector_add_string");
list=dlsym(dp,"vector_list_strings");

add("hello");
add("bye");

list(buff);

printf("%s",buff);

return 0;
}

编译:
gcc -rdynamic -s -o test test.c -ldl
(注意: -ldl 是必须加的)


相关文章

分类

2 Comments

said:

有个问题想请教一下,如果我在c中调用的c++类中又调用了其他类的方法,该如何编译啊?

DongHao Author Profile Page said:

不管有多少个类,都要先编译成.so,比如上面的例子,假使有vector.cpp,list.cpp,wrapper.cpp三个c++类,则先要
g++ -shared -o vector.so vector.cpp list.cpp wrapper.cpp
此时的vector.so里包含了三个类的信息,然后再
gcc -rdynamic -s -o test test.c -ldl
便可以了

留言:

关于文章

This page contains a single entry by DongHao published on 08 15, 2007 6:26 PM.

实模式下显示字符的引导扇区程序 was the previous entry in this blog.

看了《斯巴达三百壮士》 is the next entry in this blog.

Find recent content on the main index or look in the 存档 to find all content.