2016-08-01 19 views
0

我使用一个模块级的函数调用来注册的注册类工厂功能:G ++ 4.9 - 模块范围内的函数未被调用?

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) 
{ 
} 

其中例如:: DEV :: DeviceRegistry :: RegisterControllerClass()是在命名空间如免费功能DEV。这在Visual Studio下运行良好,但是在GCC/Linux上运行代码似乎没有被调用 - 如果我断点RegisterControllerClass(),它不会被调用。为了防止编译器优化s_id字段,我使用它来构造基类。所以我相信不是这样。这段代码有什么问题?

+1

您必须确保翻译单元已链接。一种方法是从'main'中调用其中的函数。 –

+2

什么是模块范围? – NathanOliver

+0

在翻译单元内(即cpp文件+包含的标题)。如果他们没有被标记为“静态”,我会说'全球'。 –

回答

0

连接器试图过于聪明并删除它认为未被调用的代码,但会间接调用它。

添加命令行选项在NetBeans连接选项对话框库

轮候册,各地 - 全归档 LIB 轮候册, - 无整个归档 ...

解决了这个问题。育。

+0

W1?你在开玩笑吗? -Wl。 –

+0

@KonstantinVladimirov哈哈,有趣的字体(记住关于从不使用'l'作为变量的编码规则) –

相关问题