gpt4 book ai didi

c++ - 一个应用程序中同一库的两个版本

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:21:07 24 4
gpt4 key购买 nike

我有同一个共享库的两个版本(具有几乎相同的 API)。我必须在同一个应用程序中使用它们。我知道如何解决 header 中的名称冲突——我将像这样导入它们

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 中的任何内容,但如果其他选项太复杂,我可以这样做。我更喜欢在编译后对这些库进行更改的解决方案,例如改变声名。但是如果我必须在应用程序代码中做一些复杂的事情来使用这些库,我更喜欢对这些库项目进行更改并维护它们(因为版本可以更改,但总会有两个——一个版本可能会永远设置并且从未更新过,所以我宁愿更改这个不变的版本)。

最佳答案

My target environment is Linux machine.

根据符号链接(symbolic link),这两个版本的库似乎具有相同的 SONAME,即 libsomething.so.2

这完全排除了将它们链接到同一个可执行文件,并在运行时使用 Linux 的运行时加载程序加载它们。它没有这个能力。

我看到的唯一选项是让您的可执行文件手动加载每个库,使用 dlopen(3)库调用。之后您将需要使用 dlsym(3) or dlsymv3(3)在每个加载的库中找到每个函数的地址,并间接调用它。

请注意,dlsym()dlsymv3() 采用每个函数名称的错位版本。由您决定每个函数的错位名称是什么。

没有人声称这会很容易,但在绝对没有其他选择的情况下这是可行的。

关于c++ - 一个应用程序中同一库的两个版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47223239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com