C++ 在单个进程中使用同一库的不同版本

C++ 在单个进程中使用同一库的不同版本,c++,dynamic,dll,cmake,C++,Dynamic,Dll,Cmake,我在C++/CMake中遇到了一个问题 假设我有thing1.exe,它使用MyLib\u v1.dll 假设我有thing2.exe,它使用MyLib_v2.dll thing1.exe和thing2.exe意味着并行运行并在它们之间传递数据(使用队列或其他方式) 我需要从2个独立的.exe文件转换为一个具有多个线程的文件(假设全局变量等没有冲突) 但是,我不能包含两个不同版本的MyLib,因为它们定义了相同的函数和名称空间 我无法更改所使用的MyLib版本 我有一个想法,将thing1和th

我在C++/CMake中遇到了一个问题

假设我有
thing1.exe
,它使用
MyLib\u v1.dll

假设我有
thing2.exe
,它使用
MyLib_v2.dll

thing1.exe
thing2.exe
意味着并行运行并在它们之间传递数据(使用队列或其他方式)

我需要从2个独立的
.exe
文件转换为一个具有多个线程的文件(假设全局变量等没有冲突)

但是,我不能包含两个不同版本的
MyLib
,因为它们定义了相同的函数和名称空间

我无法更改所使用的
MyLib
版本

我有一个想法,将
thing1
thing2
编译为
.dll
文件,使它们各自包含/加载首选版本的
MyLib
,然后拥有一个调用
thing1.dll
thing2.dll
功能的中央
.exe
,如下所示:

root/
├─ thing1libs/
│  ├─ MyLib_v1.dll
├─ thing2libs/
│  ├─ MyLib_v2.dll
├─ thing1.dll
├─ thing2.dll
├─ main.exe


这是否可能使用类似CMake的东西?或者,MyLib的两个版本在
main.exe
内部是否仍然冲突?

鉴于您的限制,我相信您描述的场景将遇到一系列无法解决的问题。除非您可以有另外两个单独的进程,一个托管MyLib_v1.dll,另一个托管MyLib_v2.dll,并使用进程间通信从ThingDuth.exe与它们通信。如果您静态链接到dll,那么您仍然会遇到符号不明确的问题。您必须手动加载相应的DLL并自己解析smybols,但这会打开另一个蠕虫。Cmake在这里的参与仅限于按照您的说明执行指定的命令来编译和链接代码。Cmake与其他任何事情都无关,包括最终结果是否有效(不太可能)。与Cmake无关,但在源代码中,通过一些手工工作(取决于函数指针的数量),这是绝对可能的。我通常将必要的winapi调用封装在一个公开dll服务的专用类中。