遇到了一个 在linux上c的需求 需要调用调用c++的sdk 为了调通环境先做个demo
c++库
first.h
#include <iostream>
using namespace std;
class hello
{
public:
void method();
};
first.cpp
#include "first.h"
void hello::method()
{
cout<<"hello world!\n";
}
然后编译成.so库放到/lib下
sudo g++ -fpic -shared -g -o /lib/libfirst.so first.cpp
注:动态库命名标准是lib+xxx+.so
中间层
second.h
#ifdef _cplusplus
extern "C"
{
#endif
void secondHello();
#ifdef _cplusplus
}
#endif
second.cpp
#include "first.h"
#ifndef _cplusplus
#define _cplusplus
#include "second.h"
#endif
void secondHello()
{
hello h;
h.method();
}
中间层的特点是用c的风格写c++ 由于头文件被c和c++共同使用 所以一定要加 extern “C” 判断
然后编译中间层的.so库 同样放到lib下
sudo gcc -fpic -shared -o /lib/libsecond.so second.cpp -lfirst
注; -l后紧接新编译的库first -l可以使用多个
c调用
main.c
#include <stdio.h>
#include <dlfcn.h>
#include "second.h"
int
main()
{
void (*dlfunc)();
void *handle; //定义一个句柄
handle = dlopen("./second.so", RTLD_LAZY);//获得库句柄
dlfunc = dlsym(handle, "secondHello"); //获得函数入口
(*dlfunc)();
dlclose(handle);
return 0;
}
编译c
sudo gcc -o main main.c -lsecond -ldl
执行c
./main
踩坑
最后执行的时候总是遇到如下报错
./main: error while loading shared libraries: libsecond.so: cannot open shared object file: No such file or directory
在网上找了好久并没有解决办法 研究了好久后发现
使用ldd main
命令查看依赖 发现默认lib并不是/lib而是/lib64 如下图
将两个编译出来的so库移动到/lib64下 正常执行