在C程序中是没有对象这个概念的,因此无法直接使用C++库中的方法,只好从再封装一层库来调用C++中的方法了。
1. C++程序如下所示:
// aa.h
#include <iostream>
using namespace std;
class sample
{
public:
int method();
};
// aa.cpp
#include "aa.h"
int sample::method()
{
cout<<"method is called!\n";
return 0;
}
2. 封装libaa.so的C++库libmylib.so代码如下所示:
// mylib.h
#ifdef __cplusplus
extern "C"
{
#endif
int myfunc(void);
#ifdef __cplusplus
}
#endif
// mylib.cpp
#include "aa.h"
#ifndef __cplusplus
#define __cplusplus
#endif
#include "mylib.h"
int myfunc()
{
sample ss;
ss.method();
return 0;
}
3. 调用C++库的C程序代码如下所示:
// main.c
#include <stdio.h>
#include <dlfcn.h>
#include "mylib.h"
int main()
{
#if 0
int (*dlfunc)();
void *handle;
handle = dlopen("./mylib.a", RTLD_LAZY);
dlfunc = dlsym(handle, "myfunc");
(*dlfunc)();
dlclose(handle);
#else
myfunc();
#endif
return 0;
}
4. 编译上述代码的脚本 build.sh
echo "Compile libaa.*"
# Note: install libaa.so to /use/lib
rm -f aa.o libaa.so libaa.a
g++ -fpic -shared -g -o libaa.so aa.cpp -I ./
#g++ -c aa.cpp -o aa.o -I ./
#ar -rc libaa.a aa.o
echo "Compile libmylib.*"
rm -f mylib.o libmylib.so libmylib.a
gcc -fpic -shared -g -o libmylib.so mylib.cpp -laa -I ./ -L ./
#g++ -c mylib.cpp -o mylib.o -I ./
#ar -rc mylib.a libmylib.o
echo "Compile main"
rm -f main.o main
#gcc -o main main.c -lmylib -laa -L ./ -ldl
gcc -o main main.c -lmylib -laa -L ./
#g++ main.c -o main mylib.a -L./