链接库头文件:
head.h
class A
{
public:
A()
virtual ~A()
int gt()
int pt()
private:
int s
}
firstso.cpp
#include <iostream>
#include "head.h"
A::A(){}
A::~A(){}
int A::gt()
{
s=10
}
int A::pt()
{
std::cout<<s<<std::endl
}
编译命令如下:
g++ -shared -o libmy.so firstso.cpp
这时候生成libmy.so文件,将其拷贝到系统库里面:/usr/lib/
进行二次封装:
secso.cpp
#include <iostream>
#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
下面开始调用:
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
$
因为c++的各种复杂机制,生成的动态链接库中的符号名是不符合C的机制的,直接链接会失败,一般解决c和c++的链接问题是在c++的代码上进行处理的,只要将你的cpp文件中的函数定义都加上extern "c"前缀,就可以编译成C可链接的库。如果你只有cpp的库文件,没有源码文件的话,没法处理。
// a.cppextern "C" int cpp_func() { return 0 }
// b.c
#include <stdio.h>
int cpp_func()
int main() {
printf("%d\n", cpp_func())
return 0
}
// ***compile and link***
// g++ a.cpp -o a.o
// gcc b.c -o b.o
// g++ a.o b.o -o a.out && ./a.out