- 论坛徽章:
- 0
|
趁五一整理了一份FAQ,新手看一下
Q:c能调用c++封装的动态库吗?
A:可以,使用dlopen , dlsym 和 extern "C"
下面是个简单的例程:
[root@localhost dlopen]# ls
chello.cpp hello.cpp include main.c
[root@localhost dlopen]# cat include/hello.h
#ifndef _HELLO_H_
#define _HELLO_H_
class CHello
{
public:
CHello();
~CHello();
int Print();
};
#endif
[root@localhost dlopen]# cat hello.cpp
#include "hello.h"
#include <iostream>;
CHello::CHello()
{
}
CHello::~CHello()
{
}
int CHello: rint()
{
std::cerr << "hello world !" << std::endl;
}
[root@localhost dlopen]# cat chello.cpp
extern "C"
{
#include "hello.h"
int cprint()
{
CHello * phello;
(void *)phello = (void *)new CHello ;
(void *)phello->; Print();
return 0;
}
}
[root@localhost dlopen]# cat main.c
//#include "chello.h"
#include <dlfcn.h>;
#include <stdio.h>;
#include <stdlib.h>;
int cprint();
int
main ()
{
char *error;
void *handle = dlopen ("libhello.so", RTLD_NOW);
if (!handle)
{
fprintf (stderr, "%s\n", dlerror ());
exit (1);
}
int (*dlprint)() ;
(void *)dlprint = dlsym (handle, "cprint" ;
if ((error = dlerror ()) != NULL)
{
fprintf (stderr, "%s\n", error);
exit (1);
}
(*dlprint)();
dlclose (handle);
return 0;
}
[root@localhost dlopen]# g++ -I./include -c hello.cpp
[root@localhost dlopen]# g++ -I./include -c chello.cpp
[root@localhost dlopen]# g++ -fPIC -shared -o libhello.so hello.o chello.o
[root@localhost dlopen]# gcc -I./include -o main main.c -lhello -ldl
[root@localhost dlopen]# ls
chello.cpp chello.o hello.cpp hello.o include libhello.so main main.c
[root@localhost dlopen]# ./main
hello world !
[root@localhost dlopen]# |
|