C++ 在C++;
我有两个来自«vendor1»和«vendor2»的静态库:C++ 在C++;,c++,static,namespaces,C++,Static,Namespaces,我有两个来自«vendor1»和«vendor2»的静态库: vendor1.lib和vendor1.h vendor2.lib和vendor2.h 在文件中,vendor1.h。声明如下: double Min(); double Min(); 在文件中,vendor2.h。声明如下: double Min(); double Min(); 在我的客户端文件中: include "vendor1.h" include "vendor2.h" double x = Min()
和vendor1.lib
李>vendor1.h
和vendor2.lib
vendor2.h
vendor1.h
。声明如下:
double Min();
double Min();
在文件中,vendor2.h
。声明如下:
double Min();
double Min();
在我的客户端文件中:
include "vendor1.h"
include "vendor2.h"
double x = Min();
#include "vendor1_wrapper.h"
#include "vendor2_wrapper.h"
...
vendor1::Min();
vendor2::Min();
它默认调用vendor1.h
。我尝试引入名称空间:
namespace vendor1 {
include "vendor1.h"
}
namespace vendor2 {
include "vendor2.h"
}
对以下函数的调用
double xx = vendor2::Min();
我收到以下链接器错误:
Client.cpp 1>Client.obj:错误LNK2019:未解析的外部符号“double\uu cdecl vendor2::Min(void)”(?Min@vendor2@@YANXZ)参考
在函数\u wmain 1>c:\temp\Client\Debug\Client.exe中:致命错误
LNK1120:1个未解析的外部
如何在不为每个包装创建包装的情况下修复此问题?如果有两个名称冲突的静态库,则无法静态链接程序!静态链接器只需找到与未定义符号匹配的第一个符号,然后选择该符号。将名称包装到命名空间中没有帮助:这会更改库中预期的命名空间。您刚刚发现了为什么名称空间是一件好事
如何解决这个问题?我不知道一种基于C++标准的方法。实际上,您可以做一些事情:创建一个动态库,它转发给您的冲突函数,但将名称放入单独的名称空间(或使用不同的名称)。动态库与单个静态库链接,即此时不会发生冲突。您可能还需要避免底层名称从共享库中的符号可见。如何实现这一点的细节取决于编译器,我不知道该由谁来处理类似的问题。将函数包装到不同的名称空间如何 vendor1\u wrapper.h:
namespace vendor1 {
double Min();
}
#include "vendor1_wrapper.h"
#include "vendor1.h"
namespace vendor1 {
double Min()
{
return Min();
}
}
namespace vendor2 {
double Min();
}
#include "vendor2_wrapper.h"
#include "vendor2.h"
namespace vendor2 {
double Min()
{
return Min();
}
}
vendor1\u wrapper.cpp:
namespace vendor1 {
double Min();
}
#include "vendor1_wrapper.h"
#include "vendor1.h"
namespace vendor1 {
double Min()
{
return Min();
}
}
namespace vendor2 {
double Min();
}
#include "vendor2_wrapper.h"
#include "vendor2.h"
namespace vendor2 {
double Min()
{
return Min();
}
}
供应商2_包装器.h:
namespace vendor1 {
double Min();
}
#include "vendor1_wrapper.h"
#include "vendor1.h"
namespace vendor1 {
double Min()
{
return Min();
}
}
namespace vendor2 {
double Min();
}
#include "vendor2_wrapper.h"
#include "vendor2.h"
namespace vendor2 {
double Min()
{
return Min();
}
}
供应商2_包装器.cpp:
namespace vendor1 {
double Min();
}
#include "vendor1_wrapper.h"
#include "vendor1.h"
namespace vendor1 {
double Min()
{
return Min();
}
}
namespace vendor2 {
double Min();
}
#include "vendor2_wrapper.h"
#include "vendor2.h"
namespace vendor2 {
double Min()
{
return Min();
}
}
现在,您可以使用名称空间(客户端文件)使用函数:
丑陋,但你可以。C链接不支持名称空格。如果要静态链接这两个库,则无法真正解决此问题。如果可以的话,你可以尝试动态加载它们。谢谢。本练习/回答了与名称空间和名称损坏相关的清晰概念。