Pie*_*e I 5 c c++ cross-language
我想在C ++代码中使用C库,而无需对其进行修改。
该库包含与c ++不兼容的代码片段,例如:
new
和delete
_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")
Run Code Online (Sandbox Code Playgroud)
我的标题开头为:
extern "C"{
#include "lib/libfrr.h"
}
Run Code Online (Sandbox Code Playgroud)
我有很多错误。一点汇编:
/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__}; \
Run Code Online (Sandbox Code Playgroud)
一个简单的(虽然可能不是唯一的)解决方案:
由于您的库包含与C ++不兼容的C代码-不在两种语言的公共子集中-您必须编写C ++ 可以使用的绑定。这些将需要用C而不是C ++编写。
让我们把你写的绑定垫片文件frr_cpp_bindings.h
和frr_cpp_bindings.c
。
填充程序的头文件frr_cpp_bindings.h
将会与暴露基本相同的内容libfrr.h
,但没有任何实际代码(如./r.inf = &_frrmod_info
)-仅函数和类型定义在C ++和C的公共子集中。
该shim(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
Run Code Online (Sandbox Code Playgroud)
这意味着您不需要extern "C"
使用C ++代码。
最后,因此您的C ++源文件将具有:
#include <frr_cpp_bindings.h>
Run Code Online (Sandbox Code Playgroud)
并且不会尝试直接包含不兼容的标头。