Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
包裹在ifdef中的Qt信号_Qt_G++_Conditional Compilation - Fatal编程技术网

包裹在ifdef中的Qt信号

包裹在ifdef中的Qt信号,qt,g++,conditional-compilation,Qt,G++,Conditional Compilation,我的Qt项目链接到一个仅限linux的库。当项目在linux下运行时,我希望使用该库中定义的类型在事件上触发一个信号。不过,我遇到的一个复杂问题是,该项目还必须在Windows中构建。显然,这个信号和捕捉它的插槽在Windows中不存在,这很好。但是,我发现Qt的moc工具无法识别发出信号的代码周围是否存在\ifdef\uuuuu linux\uuuuu。我的代码如下所示: [SomeFile.h] #ifdef __linux__ signals: void SomeSignal(Some

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

[SomeFile.h]

#ifdef __linux__
signals:
  void SomeSignal(SomeTypeDefinedInTheLinuxLibrary);
#endif
[SomeFile.cpp]

#ifdef __linux__
  emit SomeSignal(someObject);
#endif
当我试图用g++编译这个时,我得到了一个错误:
SomeFile.cpp:(.text+0x858c):对SomeFile::SomeSignal的未定义引用(在inuxlibrary中定义的sometypes)


如何让moc和#ifdef配合得很好?一个更好的解决方案是始终提供信号,并注释掉在Windows上触发信号的代码。这样,公共API在所有平台上都是相同的

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


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

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


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

我希望我可以这样做,但与信号相关的参数类型由linux特定库定义。如果我试图在没有注释掉信号的情况下在windows下构建,则会出现未定义类型的错误。@Dave:包装该类型或使用
\ifndef\uuuu linux\uu
在其中定义您自己的虚拟类型,以便它在windows上编译。感谢您的输入。最后我把打字机包装好,开始工作了。moc生成的代码似乎仍然应该遵守信号/插槽代码所在的#ifdef。这意味着moc必须将#ifdef复制到生成的类中。