在C ++中使用多个静态库进行冲突解决

时间:2012-02-07 20:17:50

标签: c++ static namespaces

我有2个来自«​​vendor1»和«vendor2»的静态库:

  • vendor1.libvendor1.h;
  • vendor2.libvendor2.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个未解析的外部

如何在不为每个包装器创建包装器的情况下解决这个问题?

2 个答案:

答案 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();