6

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

[一些文件.h]

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

[一些文件.cpp]

#ifdef __linux__
  emit SomeSignal(someObject);
#endif

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

任何想法如何让 moc 和 #ifdefs 一起玩得很好?

4

2 回答 2

6

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

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

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

于 2010-11-22T14:43:55.167 回答
0

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

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

于 2015-01-08T17:52:35.240 回答