如果不可用,避免链接方法
Avoid linking method if not available
我试图链接相同的应用程序的两个不同版本的同一库。我们将库命名为libOld和libNew。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来支持。
- 使用类模板的方法链接错误
- 为什么调用没有正文的纯虚拟方法不会导致链接器错误?
- 在使用库时,找到要链接的必要库的快速方法是什么
- 尝试使用 extern "C" 调用 C 中的C++方法,得到"undefined reference to"对象的链接器错误
- 将多个效果与 libSox 链接并读取输出数据的正确方法
- 当只有静态方法受到影响时,如何解决C++中的链接器错误?
- 从方法链接中使用的临时移动
- 无法使用 Gradle 链接同一源文件中C++方法
- 为什么链接器报告全局函数的乘法定义符号,而不是类静态方法
- 使用 CMake 的静态方法链接错误
- gRPC trace.cc 的方法 TraceFlagList::Add(TraceFlag* flag) 使其链接列表
- 将枚举与 CMake 链接的正确方法是什么?
- 在没有额外代码的情况下链接两个独立类的最通用方法是什么?
- 在链接列表中添加字符串的简单方法
- 显式链接 DLL 和类方法
- 模板或链接接缝依赖注入有哪些替代方案来测试非虚拟方法?
- 为什么我不能在未链接的 DLL 上调用方法,但可以这样做?C++
- 同一对象的链接方法
- jni java.lang.unsatisfiedlinkerror,无法链接方法
- 如果不可用,避免链接方法