2010-06-02 27 views
7

爲了保持我的Qt項目有點組織(使用Qt Creator),我有一個.pro文件和多個.pri文件。就在最近,我添加了一個類到我的一個.pri文件,它具有與已存在於單獨的.pri文件中的類相同的文件名。Qt使用多個.pri文件的MOC文件名衝突

由qmake生成的文件結構和makefiles似乎忽略了隨之而來的文件名衝突。生成的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的內容:subdir2.pri的

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

內容:

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

有沒有辦法告訴qmake生成一個系統,將moc_ *文件從單獨的.pri文件放入單獨的子目錄中?

回答

3

最好的辦法是確保所有文件都有唯一的名稱。除了qmake之外,還有其他一些工具,當你嘗試做你正在做的事情時它們也會崩潰;你也有可能讓自己感到困惑(例如,理解#include "file.h"做什麼更困難)。

+0

我不一定與混亂的說法一致是我包括陳述通常會採用以下形式: 的#include「subdir1/file.h」 Nontheless,你似乎是正確的。獨特的文件名似乎是唯一的途徑。 – Stephen 2010-06-03 15:58:21

+0

我相信moc文件和目標文件現在不會相互衝突,如果你已經跟着我的..相對於你的評論雖然:)糾正我,如果我的錯誤.. – liaK 2010-06-03 16:07:03

4

subdir1.pri嘗試附加

​​

也爲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文件可以被具有相同的文件名不發生碰撞的工作。既然你已經接受了一個答案(說明這是不可能的),請進行上述修改並試一試。不要讓它知道它是否工作。

+0

沒有運氣。 moc文件現在不互相沖突,但是對象(.o)文件是。唉。 – Stephen 2010-06-03 15:55:52

+0

嘗試給OBJECTS_DIR =「subdir2/ObjFiles」 – liaK 2010-06-03 16:00:37

0

我以前試過這個。簡短的回答是以某種方式對它們進行不同的命名。另一個答案是將每個子目錄作爲一個單獨的庫,用它自己的.pro文件處理,並使用一個子類型來編譯所有的庫目錄。

如果您真的想調查完整答案,您可以指定用於moc的工具。在這種情況下,您可能可以修改名稱,以便爲兩個不同的文件使用稍微不同的名稱。但是,您還需要確保每個不同名稱的文件都被添加到文件列表中以進行編譯和鏈接,並且最初命名的moc文件不會(或者您的編譯將失敗)。