由于静态链接(用于汽车工厂注册),c++丢失了静态函数调用



我有一个实现的抽象工厂与自动注册:即。在我的派生类中,我有一个对注册我的类的工厂的单例的静态调用。我的类总是在被链接到可执行文件的库中。

这是我的cpp文件的注册调用:

static bool DERIVED_CLASS_NAME_reg = singleton<abstract_factory>::instance().register("DERIVED_CLASS_NAME");

这在动态链接时非常有效。即使在多个库中有我的派生类,当可执行程序被调用时,它们都被注册。当静态链接时,静态注册调用永远不会被执行,我的类也不会被注册。

我假设当静态链接可执行文件时,编译器决定删除所有未被可执行文件直接调用的内容。如果是这种情况,我怎么告诉编译器包含这个?

如果可以是别的东西,你有什么想法吗?

谢谢


我的初始实现在这里讨论:c++自动工厂注册的派生类型

链接时,不能保证库中的对象文件包含,除非对象文件中至少有一个符号解析了迄今未定义的符号。我你的工厂对象是在一个对象文件中,它不解析任何符号,因此,在链接过程中被忽略。

事实上,根本不能保证对象文件中的所有符号都被包含:一些编译器支持函数级部分,而链接器只包含引用的符号,而不包括其他符号。由于您的注册符号从未被引用,它可能最终不包括在内。我所知道的大多数系统默认情况下不使用函数级部分,也就是说,即使注册符号本身不包括在内,也足以保证你的目标文件被包括在内。

注册事物最安全的方法是为每一个事物调用一个函数。如果不能调用相应的函数,则显式链接相应的目标文件是次优选择。简单地使用静态库进行链接是行不通的。这个问题在共享对象中不会发生,因为共享对象包含了所有的对象文件和它们的所有符号。

最新更新