Qt信号包含在ifdef中

时间:2010-11-22 14:38:20

标签: qt g++ conditional-compilation

我的Qt项目链接到仅限linux的库。当项目在linux下运行时,我希望使用该库中定义的类型在事件上触发信号。但是,我的一个复杂因素是该项目还必须在Windows中构建。显然,这个信号和捕获它的插槽在Windows中不存在,这很好。但是,我发现Qt的moc工具无法识别发出信号的代码周围是否存在#ifdef __linux__。我的代码如下所示:

[SomeFile.h]

#ifdef __linux__
signals:
  void SomeSignal(SomeTypeDefinedInTheLinuxLibrary);
#endif

[SomeFile.cpp]

#ifdef __linux__
  emit SomeSignal(someObject);
#endif

当我尝试使用g ++编译时,我收到错误: SomeFile.cpp:(.text+0x858c): undefined reference to SomeFile::SomeSignal(SomeTypeDefinedInTheLinuxLibrary)

如何让moc和#ifdefs一起玩得好?

2 个答案:

答案 0 :(得分:5)

更好的解决方案是始终提供信号,并在Windows上注释掉触发它的代码。这样,公共API在所有平台上都是相同的。

[编辑] moc工具真的很蠢。它实际上并不理解代码;相反,它只是对某些模式做出反应。这就是它忽略#ifdef

的原因

要解决此问题,请包装该类型或使用#ifndef __linux__并在其中定义您自己的虚拟类型,以便在Windows上进行编译。由于信号不会在Windows上发出,因此永远不会使用插槽,因此任何使代码编译的类型都可以正常使用。

答案 1 :(得分:0)

使用Qt 5.3至少使用Visual Studio,我能够将预处理器宏传递给moc工具。为了使这项工作,我不得不对我的Visual Studio项目文件进行文本编辑,并为每个文件手动添加命令行参数,以便将预处理器参数传递给moc工具。您可以使用-D [预处理器],即-DSPECIAL_BUILD或-DSPECIAL_BUILD = 1,并且moc编译器足够智能,可以在代码中查看#if SPECIAL_BUILD检查,而不是尝试moc这些部分。

只需搜索" moc.exe"并为每个配置添加适当的参数。