由于静态链接(用于汽车工厂注册),c++丢失了静态函数调用
c++ lost static function calls due to static linking (for auto factory registration)
我有一个实现的抽象工厂与自动注册:即。在我的派生类中,我有一个对注册我的类的工厂的单例的静态调用。我的类总是在被链接到可执行文件的库中。
这是我的cpp文件的注册调用:
static bool DERIVED_CLASS_NAME_reg = singleton<abstract_factory>::instance().register("DERIVED_CLASS_NAME");
这在动态链接时非常有效。即使在多个库中有我的派生类,当可执行程序被调用时,它们都被注册。当静态链接时,静态注册调用永远不会被执行,我的类也不会被注册。
我假设当静态链接可执行文件时,编译器决定删除所有未被可执行文件直接调用的内容。如果是这种情况,我怎么告诉编译器包含这个?
如果可以是别的东西,你有什么想法吗?
谢谢
我的初始实现在这里讨论:c++自动工厂注册的派生类型
链接时,不能保证库中的对象文件包含,除非对象文件中至少有一个符号解析了迄今未定义的符号。我猜你的工厂对象是在一个对象文件中,它不解析任何符号,因此,在链接过程中被忽略。
事实上,根本不能保证对象文件中的所有符号都被包含:一些编译器支持函数级部分,而链接器只包含引用的符号,而不包括其他符号。由于您的注册符号从未被引用,它可能最终不包括在内。我所知道的大多数系统默认情况下不使用函数级部分,也就是说,即使注册符号本身不包括在内,也足以保证你的目标文件被包括在内。
注册事物最安全的方法是为每一个事物调用一个函数。如果不能调用相应的函数,则显式链接相应的目标文件是次优选择。简单地使用静态库进行链接是行不通的。这个问题在共享对象中不会发生,因为共享对象包含了所有的对象文件和它们的所有符号。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- C++从另一个类访问公共静态向量的正确方法是什么
- 基于boost的程序的静态链接——zlib问题
- 在静态库中嵌入类方法
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 如何在C++中获得"静态纯虚拟"功能?
- 私有类型的静态常量成员
- 使用gcc从静态链接的文件中查找可选符号
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 如何在C++中使用非静态成员函数作为回调函数
- 将静态库链接到不带-fPIC的共享库中
- 静态结构和一个定义规则
- 为什么虚函数不能是静态的和全局的?
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身