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

C++ 如果不可用,请避免使用链接方法,c++,C++,我正在尝试将同一应用程序链接到同一库的两个不同版本。让我们调用库libOld和libNew。libNew有一个libOld没有的新方法(我们称之为newMethod()) 当我的应用程序尝试调用不在libOld中的newMethod()时,链接器显然失败了。是否有可能以某种方式绕过此问题,以便仅当newMethod()可用时才能链接到它?也就是说,如果应用程序链接到libNew而不是libOld p>我试图链接的是用C++构建的,我不能延迟或动态加载它,因为它包含导出的静态数据对象,它不包含任

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

当我的应用程序尝试调用不在libOld中的newMethod()时,链接器显然失败了。是否有可能以某种方式绕过此问题,以便仅当newMethod()可用时才能链接到它?也就是说,如果应用程序链接到libNew而不是libOld


<> p>我试图链接的是用C++构建的,我不能延迟或动态加载它,因为它包含导出的静态数据对象,它不包含任何外部C类工厂类来构造C++对象,这些类可以帮助内存管理。 工具链更新


该应用程序是在Windows for Windows CE 5.0中构建的,运行在ARM处理器上(如果需要的话)。我尝试使用的库是封闭源代码的。该应用程序使用qt框架。

人们可能会认为该库提供了一些获取版本的机制。。。问题是如何做到这一点

如果是一个带有版本号的#define,那么可以用#If’s围绕newMethod()


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

人们可能会认为库提供了一些获取版本的机制。。。问题是如何做到这一点

如果是一个带有版本号的#define,那么可以用#If’s围绕newMethod()


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

如果我理解正确,您的问题不是您可以优雅地解决的,因为它不是一个“注定”要直接解决的问题。您“注定”要根据特定的库版本构建应用程序(如果特别使其他版本与二进制兼容,它可能会对其他版本起作用,但这种情况很少见,因为它需要在设计和测试中付出额外的努力)

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


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

如果我理解正确,您的问题不是您可以优雅地解决的问题,因为它不是一个“注定”要直接解决的问题。您“注定”要根据特定的库版本构建应用程序(如果特别使其他版本与二进制兼容,它可能会对其他版本起作用,但这种情况很少见,因为它需要在设计和测试中付出额外的努力)

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


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

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


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

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


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

如果您想保持向后兼容性,可能不应该以这种方式破坏接口。那么,如果newMethod不可用,您希望调用newMethod做什么?您不能挥动魔杖,让函数消失。应用程序调用
newMethod()
newMethod()
显然做了应用程序需要的事情,除非应用程序习惯于无特殊原因调用随机函数。因此它必须调用
newMethod()
。结尾,“不能延迟或动态加载”,这是不正确的。但这确实需要一些工作。操作系统/工具链将是添加到问题中的有用信息。如果您想保持向后兼容性,可能不应该以这种方式破坏接口。那么,如果newMethod不可用,您希望调用它做什么呢?您不能挥动魔杖,让函数消失。应用程序调用
newMethod()
newMethod()
显然做了应用程序需要的事情,除非应用程序习惯于无特殊原因调用随机函数。因此它必须调用
newMethod()
。结尾,“不能延迟或动态加载”,这是不正确的。但它确实需要一些工作。操作系统/工具链将是添加到问题中的有用信息。使用#if:s的问题是,它需要构建两个不同版本的应用程序。我们的部署系统有点难以使用,我们无法部署特定版本的软件bas