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

Conflict resolution using multiple static libraries in C++

本文关键字:静态 解决 冲突 C++      更新时间:2023-10-16

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

  • 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();

我收到以下链接器错误:

客户端.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();