在具有 non-compatible 代码的 C++ 代码中使用 C 库
Use C library in a C++ code with non-compatible code
我想在 C++ 代码中使用 C 库,而不修改它。
该库包含代码片段 non-compatible 与 c++ 类似:
- C++ 关键字
new
和 delete
_Atomic
object
- 错误的声明
我把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")
我的 header 以 :
开头
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++ 绑定 shim。
由于您的库包含与 C++ 不兼容的 C 代码 - 不在两种语言的公共子集中 - 您必须编写 C++ 可以 使用的绑定。这些将需要用 C 编写,而不是用 C++。
我们将您编写的绑定 shim 文件称为 frr_cpp_bindings.h
和 frr_cpp_bindings.c
。
shim 的 header 文件 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
这意味着您不需要在 C++ 代码中 extern "C"
。
最后,您的 C++ 源文件将具有:
#include <frr_cpp_bindings.h>
并且不会尝试直接包含不兼容的 header。
我想在 C++ 代码中使用 C 库,而不修改它。
该库包含代码片段 non-compatible 与 c++ 类似:
- C++ 关键字
new
和delete
_Atomic
object- 错误的声明
我把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")
我的 header 以 :
开头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++ 绑定 shim。
由于您的库包含与 C++ 不兼容的 C 代码 - 不在两种语言的公共子集中 - 您必须编写 C++ 可以 使用的绑定。这些将需要用 C 编写,而不是用 C++。
我们将您编写的绑定 shim 文件称为 frr_cpp_bindings.h
和 frr_cpp_bindings.c
。
shim 的 header 文件 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
这意味着您不需要在 C++ 代码中 extern "C"
。
最后,您的 C++ 源文件将具有:
#include <frr_cpp_bindings.h>
并且不会尝试直接包含不兼容的 header。