我有一个 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/