gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:32 25 4
gpt4 key购买 nike

我想在 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__}; \

最佳答案

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

为您的 C 库编写一个简单的 C++ 绑定(bind) shim。

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

我们将您编写的绑定(bind) shim 文件称为 frr_cpp_bindings.hfrr_cpp_bindings.c

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

此 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++ 代码中使用 C 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56111587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com