Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以将共享库包装在静态库中以包含其依赖项吗?_C++_Gcc_Shared Libraries_Static Libraries_Dynamic Linking - Fatal编程技术网

C++ 我可以将共享库包装在静态库中以包含其依赖项吗?

C++ 我可以将共享库包装在静态库中以包含其依赖项吗?,c++,gcc,shared-libraries,static-libraries,dynamic-linking,C++,Gcc,Shared Libraries,Static Libraries,Dynamic Linking,我已从第三方获得共享库文件(调用它 LBFoO。所以我想链接到我的应用程序。我没有源代码,代码< > LBFoO。所以,只有它的相关C++头和由第三方提供的结果二进制。 LBFoO。所以有几个共享库依赖项,最值得注意的是一些Boost库,如 LBooStuthSutha。d、 除此之外,依赖项列表相当少(基本上就是libstdc++.so.6) 这里有一个陷阱:我的应用程序大量使用Boost,它是针对较新版本v1.55构建的。因此,如果我尝试将我的应用程序与它所需的v1.55库以及libfoo的

我已从第三方获得共享库文件(调用它<代码> LBFoO。所以我想链接到我的应用程序。我没有源代码,代码< > LBFoO。所以,只有它的相关C++头和由第三方提供的结果二进制。<代码> LBFoO。所以有几个共享库依赖项,最值得注意的是一些Boost库,如<代码> LBooStuthSutha。d、 除此之外,依赖项列表相当少(基本上就是
libstdc++.so.6

这里有一个陷阱:我的应用程序大量使用Boost,它是针对较新版本v1.55构建的。因此,如果我尝试将我的应用程序与它所需的v1.55库以及
libfoo的v1.48库相链接。因此
拉进来,我肯定会遇到重复符号的问题;这是不可能的只需做一点工作,我就可以将我的应用程序回滚到v1.48,但我想防止这一依赖性阻碍我在将来更改Boost版本

我是否可以在
libfoo.so
和我的应用程序之间创建某种中间产品,使Boost依赖性彼此解耦?我发现了许多类似的so问题,但我找不到一个能够抓住这种特殊情况的中间产品;它本身并不是Boost特定的,而是与Boost相关的o设计一种方法,将多个ABI不兼容的共享库版本链接到一个应用程序中

我提出了一个粗略的想法(我甚至不确定是否可能):是否有可能创建一个围绕
libfoo.so
的包装库,并静态解析其所有依赖项?如果有一种方法,我可以使用
libfoo.so
和它链接到的各种共享库创建一个静态库,比如
libfoowrapper.a
,我可以将其链接到我的应用程序中n直接(需要注意的是,我不会将任何Boost内容泄漏到包装器库的接口中,以防止ABI与这两个版本不兼容)


有什么方法可以完成这样的事情吗?首先,我使用
gcc
(Linux,MacOS);Windows(使用Visual Studio)在类似Unix的平台上操作可能是在将来。

也许你应该看看这个线程:对于Boost,你可以@MatthieuM.:谢谢,我已经考虑过了。我认为这不是一个可行的选择,因为
libfoo。所以
已经与普通
Boost
命名空间中的符号链接。如果我试图将它与Boost v1.48链接有了重命名的名称空间,它会不会在运行时无法解析这些符号?@JasonR:当然会,但是你可以扭转这个问题,将代码改为使用
boost\u 1\u 55
而不是
boost
@MatthieuM进行编译/链接。很好。我不确定为什么我没有想到这种方法。这可能是个好主意如果没有任何非Boost特定的解决方案,我可能会选择d解决方案。如果有一个通用的解决方案,我可能会更喜欢,因为我可能会让他的问题在未来再次发生,并产生另一个不是Boost的依赖项。