【问题标题】:Qt MOC Filename Collisions using multiple .pri files使用多个 .pri 文件的 Qt MOC 文件名冲突
【发布时间】:2011-02-26 22:11:31
【问题描述】:

为了让我的 Qt 项目有条理(使用 Qt Creator),我有一个 .pro 文件和多个 .pri 文件。就在最近,我向我的一个 .pri 文件中添加了一个类,该类与一个单独的 .pri 文件中已经存在的类具有相同的文件名。

qmake 生成的文件结构和 makefile 似乎忽略了随之而来的文件名冲突。生成的 moc_* 文件都被扔到同一个子目录中(取决于发布或调试),一个最终覆盖另一个。当我尝试制作该项目时,我收到了几个如下所示的警告:

Makefile.Release:318: warning: overriding commands for target `release/moc_file.cpp`

并且项目链接失败。

这是我所说的一个简单示例。

目录结构:

+ 项目目录 | + 子目录1 | | - 文件.h | | - 文件.cpp | + 子目录2 | | - 文件.h | | - 文件.cpp | - main.cpp | - 项目.pro | - subdir1.pri | - subdir2.pri

project.pro 的内容:

TARGET = project
TEMPLATE = app
include(subdir1.pri)
include(subdir2.pri)
SOURCES += main.cpp

subdir1.pri 的内容:

HEADERS += subdir1/file.h
SOURCES += subdir1/file.cpp

subdir2.pri 的内容:

HEADERS += subdir2/file.h
SOURCES += subdir2/file.cpp

有没有办法告诉 qmake 生成一个系统,将 moc_* 文件从单独的 .pri 文件放到单独的子目录中?

【问题讨论】:

    标签: qt qmake


    【解决方案1】:

    subdir1.pri 中尝试追加

    MOC_DIR = "subdir1/MOCFiles"
    

    同样对于 subdir2.pri 给予

    MOC_DIR = "subdir2/MOCFiles"
    

    它没有经过测试。只是检查一下。希望它会奏效。

    Edit 1 : MOCFiles 是您希望将 moc 文件放入的文件夹。

    编辑 2:我刚刚停止提及 MOC 文件目录,因为在问题中专门提出了这一点。但此外,您可能还必须将以下内容添加到每个 pri 文件中。 (确保不同 *.pri 文件的文件夹不同)

    RCC_DIR = "subdir1/RCCFiles"
    UI_DIR = "subdir1/UICFiles"
    OBJECTS_DIR = "subdir1/ObjFiles"
    

    我相信拥有多个 pri 文件可以使用相同的文件名而不会发生冲突。既然您已经接受了一个答案(这表明这是不可能的),请进行上述更改并尝试一下。如果它不起作用,请告知。

    【讨论】:

    • 不走运。 moc 文件现在没有相互冲突,但对象 (.o) 文件是。唉。
    • 尝试给 OBJECTS_DIR = "subdir2/ObjFiles"
    【解决方案2】:

    我以前试过这个。简短的回答是以某种不同的方式命名它们。另一个答案是将每个子目录视为一个单独的库,具有自己的 .pro 文件,并使用 subdirs 类型来编译所有库目录。

    如果你真的想调查一个完整的答案,你可以指定用于 moc 的工具。在这种情况下,您可以修改名称,以便为两个不同的文件使用稍微不同的名称。但是,您还需要确保将每个不同名称的文件添加到要编译和链接的文件列表中,并且不添加最初命名的 moc 文件(否则您的构建将失败)。

    【讨论】:

      【解决方案3】:

      最好的办法是确保所有文件都有一个唯一的名称。除了 qmake 之外,还有其他工具会在您尝试做您正在做的事情时中断;您还可能会让自己感到困惑(例如,理解 #include "file.h" 的作用更加困难)。

      【讨论】:

      • 我不一定同意混淆论点,因为我的包含语句通常采用以下形式:#include "subdir1/file.h" 尽管如此,您似乎是正确的。唯一的文件名似乎是唯一的方法。
      • 我相信,如果您关注我的,moc 文件和目标文件现在不会发生冲突。与您的评论相反:) 如果我的错误,请纠正我..
      猜你喜欢
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 2016-03-02
      • 1970-01-01
      相关资源
      最近更新 更多