Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;_C++_Static_Namespaces - Fatal编程技术网

C++ 在C++;

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»和«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();
#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链接不支持名称空格。如果要静态链接这两个库,则无法真正解决此问题。如果可以的话,你可以尝试动态加载它们。谢谢。本练习/回答了与名称空间和名称损坏相关的清晰概念。