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

时间:2019-05-13 11:42:02

标签: c++ c cross-language

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

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

  • C ++关键字newdelete
  • _Atomic对象
  • 错误的声明

我将C库编译为.so。而且我还在另一个C代码上使用了它,并且效果很好(实际上,我想制作此代码的C ++版本)。

我的CMakeLists:

# 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__};           \

1 个答案:

答案 0 :(得分:8)

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

为您的C库编写一个薄的C ++绑定填充程序。

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

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

填充程序的头文件frr_cpp_bindings.hlibfrr.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

这意味着您不需要在C ++代码中extern "C"

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

#include <frr_cpp_bindings.h>

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