我的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一起玩得好?
答案 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"并为每个配置添加适当的参数。