在C++中使用多个静态库解决冲突
Conflict resolution using multiple static libraries in C++
我有来自 «vendor1» 和 «vendor2» 的 2 个静态库:
-
vendor1.lib
和vendor1.h
; -
vendor2.lib
和vendor2.h
.
在文件中,vendor1.h
.有以下声明:
double Min();
在文件中,vendor2.h
.有以下声明:
double Min();
在我的客户端文件中:
include "vendor1.h"
include "vendor2.h"
double x = Min();
默认情况下,它调用vendor1.h
.我尝试引入命名空间:
namespace vendor1 {
include "vendor1.h"
}
namespace vendor2 {
include "vendor2.h"
}
对以下函数的调用
double xx = vendor2::Min();
我收到以下链接器错误:
客户端.cpp 1>Client.obj : 错误 LNK2019: 未解析的外部符号"双__cdecl vendor2::Min(void(" (?Min@vendor2@@YANXZ( 引用 在函数 _wmain 1>c:\temp\客户端\调试\客户端.exe:致命错误 LNK1120:1 个未解析的外部
如何在不为每个包装器创建包装器的情况下解决此问题?
如果你有两个静态库,名称冲突,你将无法静态链接你的程序!静态链接器将找到与未定义符号匹配的第一个符号并选择它。将名称包装到命名空间中无济于事:这会更改库中预期的命名空间。你刚刚发现了为什么命名空间是一件好事。
如何解决问题?我不知道基于C++标准的方法。实际上,你可以做一些事情:创建一个动态库,它转发到冲突的函数,但将名称放入单独的命名空间(或使用不同的名称(。动态库与单个静态库链接,即此时不会发生冲突。您可能还需要避免从共享库中的符号中可见基础名称。有关如何完成此操作的详细信息取决于编译器,我不知道该与MSVC++处理此类事情。
如何将函数包装到不同的命名空间中?
vendor1_wrapper.h:
namespace vendor1 {
double Min();
}
vendor1_wrapper.cpp:
#include "vendor1_wrapper.h"
#include "vendor1.h"
namespace vendor1 {
double Min()
{
return Min();
}
}
vendor2_wrapper.h:
namespace vendor2 {
double Min();
}
vendor2_wrapper.cpp:
#include "vendor2_wrapper.h"
#include "vendor2.h"
namespace vendor2 {
double Min()
{
return Min();
}
}
现在,您可以使用命名空间(客户端文件(的函数:
#include "vendor1_wrapper.h"
#include "vendor2_wrapper.h"
...
vendor1::Min();
vendor2::Min();
- 在一个解决方案中针对第三方静态库 (Creo) 的不同版本(版本)进行构建
- Clang 8 带有静态 constexpr 和数组的链接器错误 - 错误是什么以及如何解决它?
- 如何解决C++中声纳库贝静态代码分析错误"Explicitly define the missing copy constructor, move constructor .."
- 当只有静态方法受到影响时,如何解决C++中的链接器错误?
- 在这种情况下,我们可以使用静态而不是朋友吗,还有其他解决方案是什么
- C 未解决的外部符号(公共静态INT)
- 在 x86 32 位上的静态类实例中解决此问题
- C - 使用静态和动态库时解决链接器错误
- 静态和常量如何解决不明确的函数调用
- 构建静态QT时未解决的外部
- C 11魔术静态在Visual Studio 2012中的解决方法
- 静态函数阵列上未解决的外部符号
- 仅限 Xcode 9 - 如何解决由类模板中的静态变量引起的 [-Wundefined-var-template] 警告
- 虚拟静态函数功能的解决方法
- 如何将解决方案中的项目从应用程序更改为静态库
- 对受保护静态成员的未定义引用.我该如何解决
- 导出类静态常量的未解决外部符号链接错误(仅限某些项目)
- 与未解决的符号相对于静态库链接
- 未解决的外部符号 - 来自其他项目的静态函数
- 未解决的外部符号,带有静态lib,它使用了另一个静态lib