gpt4 book ai didi

包裹在 ifdef 中的 Qt 信号

转载 作者:行者123 更新时间:2023-12-04 18:52:25 29 4
gpt4 key购买 nike

我的 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 一起玩得很好?

最佳答案

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

[编辑] moc 工具真的很愚蠢。它实际上并不理解代码;相反,它只是对某些模式使用react。这就是它忽略 #ifdef 的原因。 .

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

关于包裹在 ifdef 中的 Qt 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4246533/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com