代码之家  ›  专栏  ›  技术社区  ›  Dave McClelland

包裹在ifdef中的qt信号

  •  4
  • Dave McClelland  · 技术社区  · 14 年前

    我的qt项目链接到一个仅限Linux的库。当项目在Linux下运行时,我希望使用该库中定义的类型在事件上触发一个信号。不过,我有一个复杂的问题,那就是这个项目也必须在Windows中构建。很明显,这个信号和捕获它的插槽在Windows中是不存在的,这很好。但是,我发现Qt的主运行中心工具存在问题,无法识别 #ifdef __linux__ 围绕着发出信号的代码。我的代码如下:

    [某文件]

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

    [某人档案]

    #ifdef __linux__
      emit SomeSignal(someObject);
    #endif
    

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

    有什么办法让主运行中心和ifdefs一起玩得很好吗?

    2 回复  |  直到 10 年前
        1
  •  5
  •   Aaron Digulla    14 年前

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

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

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

        2
  •  0
  •   jjxtra    10 年前

    有了Qt5.3(至少使用Visual Studio),我可以将预处理器宏传递给MOC工具。为了实现这一点,我必须对我的Visual Studio项目文件进行文本编辑,并手动为每个文件添加命令行参数,以便将预处理器参数传递给MOC工具。您可以使用-d[预处理器],即-d special-build或-dspecial-build=1,并且MOC编译器足够智能,可以查看代码中的“如果特殊的”build检查,而不尝试对这些部分进行MOC。

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