在具有不兼容代码的C++代码中使用 C 库



我想在C++代码中使用C库,而不对其进行修改。

该库包含与 c++ 不兼容的代码片段,例如:

  • C++关键字newdelete
  • _Atomic对象
  • 错误申报

我将 C 库编译成一个.so。我还在另一个 C 代码上使用它,它运行良好(实际上我想制作此代码的C++版本)。

我的CMakeList :

# Specify the minimum CMAKE version required
cmake_minimum_required(VERSION 2.8)
# Project name
project(myproject)
# Header files
set(HEADERS myCpp.h)
# Source files
set(SOURCES myCpp.cpp)
add_executable(myproject myCpp.cpp myCpp.h)
# Link libraries
LINK_DIRECTORIES(/usr/lib/libfrr.so)
target_link_libraries(${PROJECT_NAME}  frr)

set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE C)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )
set(CMAKE_CXX_FLAGS "-fpermissive")

我的标题以 :

extern "C"{
#include "lib/libfrr.h"
}

我有很多错误。一点编译:

/lib/module.h:88:3: error: expected primary-expression before '.' token
.r.info = &_frrmod_info,        
/lib/thread.h:123:2: error: '_Atomic' does not name a type
_Atomic unsigned int total_active;
lib/memory.h:163:13: error: 'struct memtype' has no member named     'n_alloc'
return mt->n_alloc;
/lib/libfrr.h:88:25: sorry, unimplemented: non-trivial designated     initializers not supported
__VA_ARGS__};           

一个简单的(尽管可能不是唯一的)解决方案:

为 C 库编写薄C++绑定填充程序。

由于您的库包含与C++不兼容的 C 代码 - 不是两种语言的公共子集 - 您必须编写C++可以使用的绑定。这些需要用 C 语言编写,而不是用 C++ 编写

让我们将绑定称为您编写的填充程序文件frr_cpp_bindings.hfrr_cpp_bindings.c

垫片的头文件frr_cpp_bindings.h将公开与libfrr.h基本相同的内容,但没有任何实际代码(如./r.inf = &_frrmod_info) - 只有位于C++和C的公共子集中的函数和类型定义。

这个填充码(frr_cpp_bindings.c)的实现将包括直接libfrr.h基本上只是转发调用libfrr.h公开的C函数。

最后,在frr_cpp_bindings.h文件中,您可以拥有如下内容:

#ifdef __cplusplus
extern "C" {
#endif
// all of the actual C code
#ifdef __cplusplus
}
#endif

这意味着您无需extern "C"C++代码。

最后,您的C++源文件将具有:

#include <frr_cpp_bindings.h>

并且不会尝试直接包含不兼容的标头。

相关内容

  • 没有找到相关文章

最新更新