我有2个来自«vendor1»和«vendor2»的静态库:
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();
我收到以下链接器错误:
Client.cpp 1> Client.obj:错误LNK2019:未解析的外部符号“double __cdecl vendor2 :: Min(void)”(?Min @ vendor2 @@ YANXZ)引用 在函数_wmain 1> c:\ temp \ Client \ Debug \ Client.exe:致命错误 LNK1120:1个未解析的外部
如何在不为每个包装器创建包装器的情况下解决这个问题?
答案 0 :(得分:2)
如果您有两个名称冲突的静态库,您将无法静态链接您的程序!静态链接器将只找到匹配未定义符号的第一个符号并选择它。将名称包装到命名空间中没有帮助:这会更改库中预期的命名空间。你刚刚发现为什么命名空间是一件好事。
如何解决问题?我不知道一种基于C ++标准的方法。实际上,您可以执行某些操作:创建一个动态库,该库可以转发到冲突的函数,但将名称放入单独的命名空间(或使用不同的名称)。动态库与各个静态库链接,即此时不会发生冲突。您可能还需要避免从共享库中的符号中看到基础名称。有关如何完成的详细信息取决于编译器,我不知道如何处理MSVC ++这样的事情。
答案 1 :(得分:1)
如何将函数包装到不同的命名空间中?
<强> 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();