faw*_*ick 5 c++ shared-libraries libtool
在我的项目中,存在对libsomething来自第三方的静态库(从现在开始调用)的依赖性。最近,libsomething已推出另一个版本。我的任务是为我的软件提供对旧版本和新版本的支持。在任何给定时间的运行时仅使用一个版本libsomething,但该版本应该在程序运行之间进行配置。
我在 WinXP 上使用 MSVC2005,第二个目标是准备切换到 Linux 和 GCC。
由于两个版本都libsomething使用相同的符号,因此将它们链接到我的可执行文件中是不可能的,因为两个版本的符号都会在链接时发生冲突。
虽然我可以创建两个可执行文件(一个链接旧版本,另一个使用新版本),但我无法决定在最终部署环境中调用哪个可执行文件(遗留原因)。
libsomething我提出了为每个版本创建动态库包装器并根据某些配置文件在运行时链接它们的想法。对于 MSCV,这意味着要使用LoadLibrary(),GetProcAddress()等,而在 Linux 上我必须使用dlopen()和dlsym()。
我知道使用libtool(即libtldl)正在包装此平台依赖性以使用共享库。这是一条合适的道路吗?有更好的(或者至少是不同的)方法吗?libtldl是否有开源的替代方案?
已经过去几年了,但为了完整性,我想提一下另一个解决方案。dlopen您可以为所有必要的函数生成简单的存根,而不是手动,dlsym并在第一次调用时(或在程序启动时)决定需要哪个库版本,加载它并解析地址。
您可以编写专门为您的项目定制的脚本或使用Implib.so工具:
# This will generate mylib.so.init.c and mylib.so.tramp.S
# which implement stubs. These need to be linked to your
# executable.
$ implib-gen.py mylib.so
Run Code Online (Sandbox Code Playgroud)
Implib.so 是仅适用于 Linux 的 atm,但应该可以轻松适应 Windows。