【发布时间】:2018-04-23 17:02:07
【问题描述】:
我有同一个共享库的两个版本(具有几乎相同的 API)。我必须在同一个应用程序中使用它们。我知道如何解决标题中的名称冲突——我将像这样导入它们
namespace version1 {
#include "version1/library.h"
}
namespace version2 {
#include "version2/library.h"
}
我不知道如何解决链接冲突——库是动态链接的。第一个版本在自定义 lib 文件夹中创建以下结构:
libsomething.so -> libsomething.so.2
libsomething.so.2 -> libsomething.so.0.8.31.1
libsomething.so.0.8.31.1
第二个:
libsomething.so -> libsomething.so.2
libsomething.so.2 -> libsomething.so.0.8.32
libsomething.so.0.8.32
我的目标环境是Linux机器。
上下文:
我有库的来源,但它们是自动下载和编译的,所以我想避免在 CMakeProject 中更改这些库的任何内容,但如果其他选项过于复杂,我可以这样做。我更喜欢在编译后对这些库进行更改的解决方案,例如改名。但是,如果我必须在应用程序代码中做一些复杂的事情来使用这些库,我更喜欢对这些库项目进行更改并维护它们(因为版本可以更改,但总会有两个 - 一个版本可能会永远设置并且从未更新,所以我更愿意更改这个不变的版本)。
【问题讨论】:
-
命名空间不会解决链接问题,除非您重建两个版本的库,以便函数也在各自的命名空间中定义。更常用的方法是,对于每个动态链接库,设置一个数据结构,其中包含一组指向该库中函数的指针。
标签: c++ compilation linker