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

时间:2016-10-11 10:58:51

标签: c++

我正在尝试将同一个应用程序链接到同一个库的两个不同版本。让我们调用库 libOld libNew 。 libNew有一个新方法(让我们称之为 newMethod()),libOld没有。

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

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

工具链更新

该应用程序是在Windows上为Windows CE 5.0构建的,在ARM处理器上运行(如果这很重要)。我试图使用的库是封闭源代码。该应用程序使用qt框架。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

人们会期望图书馆提供一些获取版本的机制......问题是如何完成。

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

如果您有返回版本的功能,或者您的版本根本不可用,现在是介绍它们的好时机,但您必须添加#ifdef才能支持。