如果不可用,避免链接方法

Avoid linking method if not available

本文关键字:链接 方法 如果不      更新时间:2023-10-16

我试图链接相同的应用程序的两个不同版本的同一库。我们将库命名为libOldlibNew。libNew有一个libOld没有的新方法(我们叫它newMethod())。

当我的应用程序试图调用newMethod()时,它不在libOld中,链接器明显失败。是否有可能以某种方式解决这个问题,以便我可以链接到newMethod(),如果它是可用的?也就是说,如果应用程序链接到libNew而不是libOld。

我试图链接的库是在c++中构建的,我不能延迟或动态加载它,因为它包含导出的静态数据对象,并且它不包含任何用于构造c++对象的外部"c"工厂类,这些类可以帮助内存管理。

工具链更新

该应用程序是在运行在ARM处理器上的Windows CE 5.0上构建的(如果有关系的话)。我试图使用的图书馆是闭源的。应用程序使用qt框架

通常的解决方案是在可执行文件中添加一个符号newMethod()。由于libNew提供了一个符号newMethod,它覆盖了弱符号。当与lidOld连接时,弱符号是唯一的符号,将被使用。

弱符号很常见,但不是标准的。检查你的编译器工具链

如果我理解正确的话,你的问题不是你可以用一种优雅的方式解决的,因为它不是一个"意味着"要直接解决的问题。您"意味着"针对特定的库版本构建应用程序(它可能针对其他版本工作,如果它们特别使二进制兼容,但这种情况很少,因为它需要在设计和测试中付出额外的努力)。

因此,如果您需要支持多个相互冲突的库版本,则需要提供多个版本的应用程序二进制文件。就这么简单。

如果你需要提供一个单独的应用程序安装包,你可以创建一个单独的启动器应用程序,它以某种方式检测应该执行哪个实际的应用程序二进制文件(这可以只是一个. bat/shell脚本)。检测可以像尝试启动一个二进制文件一样简单,如果由于特定的错误代码(由DLL加载问题引起)而失败,则启动另一个二进制文件。

人们会期望库提供某种机制来获取版本…问题是如何做到这一点。

如果它是带有版本号的#define,那么你可以用# If包围你的newMethod()。

如果您的函数返回您的版本,或者您的版本根本不可用,现在将是引入它们的好时机,但您必须添加#ifdef来支持。