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 是必须加的)
// 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 是必须加的)
相关文章
- [c++] 小心析构函数 - 07 22, 2010
- c++动态库链接错误 - 09 02, 2009
- fedora 9 小集 - 01 05, 2009
有个问题想请教一下,如果我在c中调用的c++类中又调用了其他类的方法,该如何编译啊?
不管有多少个类,都要先编译成.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
便可以了