C++ 在同一程序中使用包装器

标签 c++ static wrapper libraries

我有一个 C++ 程序 A,我在其中使用两个库 B 和 C,它们基本上是更大的库 Y 和 Z(包含在“extern “C”中)的包​​装器。我希望能够同时运行这两个库程序。

  • 这是一个 cmake 项目。

  • 我的项目的不同子目录中都有包装器 B 和 C,它们“包装”的库 Y 和 Z 位于每个相应子目录内的子目录中。

  • 除了我的包装器的 header 外,不包含任何 header 。

  • B 和 C 中的函数具有不同的名称和命名空间,Y 和 Z 中使用的函数也不同。但不幸的是,这些函数正在调用 Y 和 Z 中定义的具有相同名称和参数的其他函数,这会导致运行时错误(Y 中的函数调用 Z 中的函数而不是它自己的函数)。

我想解决这个问题,而不必编写两个相互通信的不同程序。我已经尝试将 B、C、Y 和 Z 制作为静态库。

  • 尝试了链接问题“C 函数冲突”中的重命名选项。这让我遇到了很大的麻烦。 CMakefile 的构建方式可能还有其他问题需要修复。
  • .lib 选项无效。我做了 CMake 文档中详细说明的操作:

     add_library(foo STATIC foo1.c)
     install(TARGETS foo DESTINATION lib EXPORT myproj-targets)
     install(EXPORT myproj-targets DESTINATION lib/myproj)
    

为了包括他们:

 include(${PREFIX}/lib/myproj/myproj-targets.cmake)  add_executable(myexe src1.c)  target_link_libraries(myexe foo)

最佳答案

我会通过将 B 和 C 放入 DLL 来解决这个问题,每个 DLL 只链接依赖库:B.DLL 链接来自 Y.lib,C.DLL 链接来自 Z.lib。这会将您的冲突 C API 分成单独的二进制文件,但将其保留在单个程序中。

参见 C function conflict .

关于C++ 在同一程序中使用包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26534996/

相关文章:

C++ Windows API - 如何使用 ListView 的默认 WIndows Proc?

c# - 如何在静态类中覆盖 ToString?

Java加减法用钱

c# - 在 C# 项目中使用 MediaInfo.dll

objective-c - ObjC++ 中的 Swift 属性访问

html - <body> 和 <html> 高度和布局问题

c++ - 派生类的成员函数

c++ - GStreamer 内存泄漏问题

c++ - 为什么为 noexcept 和 throw() 生成的目标代码在 C++11 中是相同的?

java - 自动生成的静态变量,必须在构造函数中传递以进行对象实例化