|
8
|
| Richard Levasseur · 技术社区 · 16 年前 |
|
|
1
7
您可以尝试围绕第三方库构建包装器库:使用该库的静态版本+将其与静态标准库链接(-static libgcc-确保通过-L获取正确的版本)。要做的重要事情是正确关闭此包装器库,即只导出原始第三方库中的符号,其他所有内容都应隐藏。这样,包装器库将公开应用程序所需的所有符号,并将标准内容封装在其中。注意:它不能保证工作,特别是当您的代码和第三方代码之间共享某些内存操作时(例如,您在代码中分配内存,在第三方中取消分配内存)。。。在这种情况下,唯一的选择是将此第三方库保留在不同的进程空间中。 我不认为上面提到的动态选项会起作用,因为你会遇到完全相同的问题——就在稍后。 一般来说,最好不要在同一进程空间中混合使用具有不同运行时间的二进制文件。这几乎总是导致灾难。 |
|
|
2
4
请您的供应商提供一个更新版本的库,该库使用的东西不会过时得可怕。如果失败了,您可以查看新应用程序是否仍能与旧版本的库一起工作,如果需要,还可以将其移植回去。尝试使用同一个库的两个不同版本会带来麻烦,我认为您不会找到可接受的解决方案。 |
|
|
3
2
虽然同时将libstdc++.so.6和libstdc++.so.5链接到您的应用程序很容易,但它的行为基本上是未定义的,因为符号基本上是偶然从任意一个库中获取的。 IMO成功的最佳方法是在旧系统(使用兼容的gcc,例如gcc 3.3)上围绕第三方库构建自己的应用程序,并让它通过IPC(例如共享内存)与主应用程序通信。这边,不行
|
|
|
4
1
虽然到目前为止给出的其中一种方法可能有效,但我认为更安全的说法是,您不能以可靠的方式直接执行此操作。如果您使用完全基于C的API(只有C兼容的结构、由malloc/free管理的内存等)编写包装器,那么您可能能够使用pobedim的解决方案。但是,如果需要交换C++结构,则不安全,因为即使可以使链接发生,不同的标准库实现也会用于同一对象。此外,C++ abi在5和.6的代码基础之间可能不兼容(我不记得几年前GNU C++的主要变化是如何发生的,与标准库SONAMS有关)。 我认为解决这个问题最安全的方法是使用多进程方法,在您的应用程序和建立在相关库上的资源/计算服务器进程之间使用某种IPC。您可以使用CORBA、D-Bus、Sun RPC或管道或套接字上的某种特殊协议来完成这项工作。我在尝试在64位应用程序中使用封闭源代码32位代码时就做到了这一点,而且效果很好。您将看到性能命中,但您也将完全回避在单个进程中尝试混合C++运行库所固有的问题。 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
MysteryMoose · GCC下故意忽略初始化器警告中的过量元素 1 年前 |
|
|
Ken P · 如何利用[*]printf格式类型规范警告? 2 年前 |
|
fghoussen · 在C结构体中,为什么打包、对齐似乎会进行填充? 2 年前 |
|
|
adversarr · 全局变量何时导出到可执行文件? 2 年前 |