C++ c++;静态链接导致静态函数调用丢失(用于自动工厂注册)

C++ c++;静态链接导致静态函数调用丢失(用于自动工厂注册),c++,static-linking,factory-pattern,C++,Static Linking,Factory Pattern,我有一个自动注册的抽象工厂的实现:即,在我的派生类中,我有一个对注册my类的工厂的单例的静态调用。我的类总是在一个链接到可执行文件的库中 这是来自我的cpp文件的注册呼叫: static bool-DERIVED\u CLASS\u-NAME\u reg=singleton链接时,不能保证包含库中的对象文件,除非对象文件中至少有一个符号解析到目前为止尚未定义的符号。我猜您的工厂对象位于一个对象文件中,该文件不解析任何符号,因此在链接过程中被忽略 事实上,无法保证对象文件中的所有符号都包含在内:

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

这是来自我的cpp文件的注册呼叫:


static bool-DERIVED\u CLASS\u-NAME\u reg=singleton链接时,不能保证包含库中的对象文件,除非对象文件中至少有一个符号解析到目前为止尚未定义的符号。我猜您的工厂对象位于一个对象文件中,该文件不解析任何符号,因此在链接过程中被忽略

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


注册东西最安全的方法是为它们中的每一个调用一个函数。如果调用相应的函数不是一个选项,那么显式链接相应的对象文件是次佳选项。简单地链接一个静态库是不行的。共享对象不会出现此问题,因为共享对象包含所有对象文件及其所有符号。

您使用的编译器是什么?你使用的是什么系统?在这里发布另一个问题中的一些最小代码示例,不会有什么坏处:P。。。另外,您是否确定
派生的\u CLASS\u NAME\u reg
确实在某个地方使用过?您确定在创建对象之前从未调用过它,还是没有调用过它?编译器是gcc,但由于代码是跨平台的,我想让clang和visual studio也能运行它,我见过库通过导出某种全局MyLibraryInit()函数来实现这一点。
static bool DERIVED_CLASS_NAME_reg = singleton<abstract_factory>::instance().register("DERIVED_CLASS_NAME");