我正在使用模块级函数调用来注册具有注册表类的工厂函数:
static Controller * ctor( Device * device, const char * ) { return new NullController(device); }
static int s_id = DeviceRegistry::RegisterControllerClass( "null", ctor );
//------------------------------------------------------------------------------
NullController::NullController( Device * device )
: Controller( device, "null", s_id )
{
}
其中eg :: DEV :: DeviceRegistry :: RegisterControllerClass()是命名空间中的自由函数,例如DEV。这在Visual Studio下运行良好,但在GCC / Linux上运行时似乎没有调用代码 - 如果我断开RegisterControllerClass(),它就不会被调用。为了防止编译器优化s_id字段,我用它来构造基类。所以我确定不是那样的。这段代码出了什么问题?
答案 0 :(得分:0)
链接器试图过于聪明并删除它认为未调用的代码,但会间接调用。
在库周围的Netbeans链接器选项对话框中添加命令行选项
-Wl, - 全归档 LIB 轮候册, - 无全存档 ...
解决了这个问题。育。