本文为C语言工程调用C++库的解决方案。
应用场景: 需要C++程序编译成的库提供函数接口,来解决C语言工程的需求。
想要快速解决问题,直接看 三、通用解决方法
人的出场顺序真的很重要,很多人如果换一个时间认识,换一个时间共处,一切都将是不一样的场景,不一样的结局。所以,人生有无限种可能,我的人生,是现在这一种。感谢大家恰到好处的出现,组成我最好的一种可能。
------ 大家好啊 我是 暮冬Z羡慕
一、C++库可以编辑的情况
C++库由自己编写,可以决定头文件书写的位置
// hello.cpp
#include "hello.h"
#include "iostream" //将用到的C++标准库,如iostream,放在本cpp文件中
using namespace std;
void sayHello(){
cout<< " # iostream: i am saying hello !" << endl;
printf(" # c: i am saying hello !\n");
}
创建 hello.cpp 文件,实现 sayHello() 功能,分别用C++标准库和C标准库的输入输出功能打印 hello!
①需要注意的是 “ 将C++标准库放在该cpp文件中”,原因后续指出。
// hello.h
#include "stdio.h" // 这里不能出现C++标准库
void sayHello();
创建头文件 hello.h 这里可以添加C语言标准库,但是不要把C++标准库放在这里。
以上 hello.h 和 hello.cpp 模拟了C++库。为了使C语言工程能够调用该库,需要增加一个中间层:
// helloWapper.cpp
#include "helloWapper.h"
void Wapper_sayHello(){
sayHello();
}
创建中间层 helloWapper.cpp , 对想要使用的C++库函数进行封装,即: 通过 Wapper_sayHello() 调用 sayHello()
// helloWapper.h
#include "hello.h"
#ifdef __cplusplus
extern "C"{
#endif
void Wapper_sayHello();
#ifdef __cplusplus
}
#endif
创建中间层头文件 helloWapper.h,暴露 Wapper_sayHello() 接口。中间出现的 extern "C" {} 是告诉G++编译器,对中间的函数按照C语言的方式进行编译。
然后将上述两个CPP文件编译成 静态库 ,使用的 CMakeLists.txt 文件如下:
cmake_minimum_required (VERSION 3.5)
project (demo)
include_directories (${PROJECT_SOURCE_DIR}/include ) # 指定头文件位置
set (test_call_LIST ${PROJECT_SOURCE_DIR}/src/hello.cpp
${PROJECT_SOURCE_DIR}/src/helloWapper.cpp) # 指定需要编译的CPP文件
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) # 指定库输出路径
add_library(hello STATIC ${test_call_LIST}) # 编译
所有文件结构如下: