如何在 Linux 中的同一进程中加载两个版本的库?
How to load two versions of a library in the same process in Linux?
我正在做一个项目,我需要在 Linux 的同一个应用程序中加载同一个库的两个版本。我发现,为了能够在没有任何库冲突问题的情况下成功地做到这一点,我必须使用自己的导出映射对两个版本的库进行符号版本化。似乎如果 运行 应用程序有这种引用,“name@@nodename”,Linux 中的动态加载器将只在 nodename 而不是其他地方查找名称。这就是我对两个库进行符号版本化的原因得出的结论。这个推理正确吗?是否有任何其他选项可以在同一应用程序中加载同一库的两个版本而不会发生库冲突?
如果您控制使用该库的代码,一个简单的操作过程就是 upgrade/downgrade,这样您就不会依赖同一个库的两个不同版本。如果您的项目的另一部分也依赖于该库,或者您对另一个 third-party 库有同样的问题,您将有更多的工作。这会减慢您的升级路径。
如果这是一个大型项目并且两个端点不相关,您可能希望将它们拆分成单独的 services/process,并带有一些进程间通信 (IPC) 层 in-between。例如 message-queues、管道或套接字。这种方法被称为微服务架构。在某些方面,这个解决方案扩展性更好,你有 IPC 层引入的开销,但新结构可能更容易理解、调试和测试。
另一种方法是自己实现此 third-party 依赖项的功能。您可以满足两个版本的要求。如果图书馆是open-source,那么一半的工作已经在那里了。此选项提供了极大的灵活性,因为您可以根据自己的需要对其进行定制,但会增加开发人员的开销。
您使用导出映射的解决方案是有效的,但可能难以维护,所以我不推荐它。对于大型图书馆,如果没有脚本,它甚至可能不可行。当您想升级时会发生什么?
我正在做一个项目,我需要在 Linux 的同一个应用程序中加载同一个库的两个版本。我发现,为了能够在没有任何库冲突问题的情况下成功地做到这一点,我必须使用自己的导出映射对两个版本的库进行符号版本化。似乎如果 运行 应用程序有这种引用,“name@@nodename”,Linux 中的动态加载器将只在 nodename 而不是其他地方查找名称。这就是我对两个库进行符号版本化的原因得出的结论。这个推理正确吗?是否有任何其他选项可以在同一应用程序中加载同一库的两个版本而不会发生库冲突?
如果您控制使用该库的代码,一个简单的操作过程就是 upgrade/downgrade,这样您就不会依赖同一个库的两个不同版本。如果您的项目的另一部分也依赖于该库,或者您对另一个 third-party 库有同样的问题,您将有更多的工作。这会减慢您的升级路径。
如果这是一个大型项目并且两个端点不相关,您可能希望将它们拆分成单独的 services/process,并带有一些进程间通信 (IPC) 层 in-between。例如 message-queues、管道或套接字。这种方法被称为微服务架构。在某些方面,这个解决方案扩展性更好,你有 IPC 层引入的开销,但新结构可能更容易理解、调试和测试。
另一种方法是自己实现此 third-party 依赖项的功能。您可以满足两个版本的要求。如果图书馆是open-source,那么一半的工作已经在那里了。此选项提供了极大的灵活性,因为您可以根据自己的需要对其进行定制,但会增加开发人员的开销。
您使用导出映射的解决方案是有效的,但可能难以维护,所以我不推荐它。对于大型图书馆,如果没有脚本,它甚至可能不可行。当您想升级时会发生什么?