c语言sscanf函数的用法是什么
455
2022-10-10
C语言如何调用C++库
背景
有的项目,比如spdk是用C实现的,但是它框架里的bdev可能需要调用到外部基于C++实现的接口。怎么办?
方法论
理解程序预处理、编译、汇编、链接的处理流程之后,不难理解只要把C++接口相应的库连接到C语言项目里,理论上就可以解决符号冲突。
步骤
1.把C++项目中封装出给C项目需要用的接口,生产对应的头文件和库 2.在C语言项目中,include相应的头文件,调用相应的接口函数 3.在C语言项目中,更新make file , 连接上面步骤1中提供的库及其依赖的库
示例
1.把C++项目中封装出给C项目需要用的接口,生产对应的头文件和库
for exmaple: 在下面的C++文件wrapper_implemet.cc中实现期望的功能:
void XuanWrite(char * vol, char * buf, int32_t size, int64_t off, void *ctx) { (void)(vol); xuan::gateway::ProcessSheepdogRequest(xuanu::gateway::kOpWrite, vol, buf, size, off, ctx); } void XuanRead(char * vol, char * buf, int32_t size, int64_t off, void *ctx) { (void)(vol); xuan::gateway::ProcessSheepdogRequest(xuawu::gateway::kOpRead, vol, buf, size, off, ctx); }
在下面的c++文件 wrapper.cc中,实现对C调用的支持:
#ifdef __cplusplus extern "C" { #endif void xuanu_write(char * vol, char * buf, int32_t size, int64_t off, void *ctx) { XuanWrite(vol, buf, size, off, ctx); } void xuanu_read(char * vol, char * buf, int32_t size, int64_t off, void *ctx) { XuanRead(vol, buf, size, off, ctx); } ..... #ifdef __cplusplus } #endif
2.在C语言项目中,include相应的头文件,调用相应的接口函数
实现上面接口给C工程调用的接口的头文件wrapper.h:
#ifdef __cplusplus extern "C" { #endif void xuan_write(char * vol, char * buf, int32_t size, int64_t off, void *ctx); void xuan_read(char * vol, char * buf, int32_t size, int64_t off, void *ctx); #ifdef __cplusplus } #endif
3. 把wrapper_implement.cc wrapper.cc 编译出静态库,准备给C工程调用
以CMakeFile为例子,库的编译方式如下:
set(TEST_SOURCE wrapper_implement.cc wrapper.cc) add_library(testlib STATIC ${TEST_SOURCE})
4.C工程链接上面的库并include 头文件 (wrapper.h)
4.1 在代码里include 上面的wrapper.h
在C工程相关的代码test.c中include上面的头文件:
#include "gateway_wrapper.h" ......... .........
4.2 链接上面产出的静态库:
C_SRCS = test.c LIBNAME = bdev_test LOCAL_SYS_LIBS = ./libtest.a
这里的难点是,如何确定步骤1 中依赖的库,1个高效的办法是 通过看C++项目中,编译生产依赖那个库的二进制的命令:
在C++ 项目中执行 make V=1 ; 找到生产依赖那个库的二进制的g++命令; 把上面命令中所有依赖的库复制到剪贴板; 把上面复制的内容粘贴到C项目中的MakeFile中去;
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~