为了保持我的Qt项目有点组织(使用Qt Creator),我有一个.pro文件和多个.pri文件。就在最近,我在我的一个.pri文件中添加了一个类,该文件的文件名与已存在于单独的.pri文件中的类相同。
qmake生成的文件结构和makefile似乎无视随后发生的文件名冲突。生成的moc_ *文件全部被抛入同一个子目录(根据发布或调试),最终会覆盖另一个。当我尝试制作项目时,我会收到几个警告:
Makefile.Release:318: warning: overriding commands for target `release/moc_file.cpp`
项目无法链接。
这是我正在谈论的一个简单例子。
目录结构:
+ project_dir | + subdir1 | | - file.h | | - file.cpp | + subdir2 | | - file.h | | - file.cpp | - main.cpp | - project.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生成一个系统,将单独的.pri文件中的moc_ *文件放入单独的子目录中?
答案 0 :(得分:4)
在 subdir1.pri 中尝试追加
MOC_DIR = "subdir1/MOCFiles"
同样适用于 subdir2.pri 给予
MOC_DIR = "subdir2/MOCFiles"
未经测试。看看吧。希望它会奏效。
编辑1:MOCFiles是您的moc文件所需的文件夹。
编辑2:我刚刚停止提及MOC文件目录,因为问题已经特别询问了。但另外,您可能还需要为每个pri文件添加以下内容。 (确保不同* .pri文件的文件夹不同)
RCC_DIR = "subdir1/RCCFiles"
UI_DIR = "subdir1/UICFiles"
OBJECTS_DIR = "subdir1/ObjFiles"
我相信拥有多个pri文件可以通过拥有相同的文件名而无冲突地工作。既然您已经接受了答案(说明不可能),请进行上述更改并尝试一下。如果它不起作用,请告诉我。
答案 1 :(得分:3)
最好的办法是确保所有文件都有唯一的名称。除了qmake之外还有其他工具,当你尝试做你正在做的事情时也会破坏它们;你也可能让自己感到困惑(例如,了解#include "file.h"
做什么更难)。
答案 2 :(得分:0)
我之前尝试过这个。简短的回答是以某种方式命名它们。另一个答案是将每个子目录视为一个单独的库,使用自己的.pro文件,并使用子目录类型来编译所有库目录。
如果您确实想要调查完整答案,可以指定要用于moc的工具。在这种情况下,您可能会破坏名称,以便为两个不同的文件使用略有不同的名称。但是,您还需要确保将每个不同命名的文件添加到要编译和链接的文件列表中,并且原始命名的moc文件不会(或者您的构建将失败)。