2011-10-14 64 views
14

我的Qt項目有兩個源文件,名稱相同但文件夾不同。 親文件是:如何使用qmake和兩個同名的源文件?

SOURCES = A/Test.cpp 
SOURCES += B/Test.cpp 

它可以產生通過Qt的Visual Studio的插件Visual Studio解決方案文件,但它不會工作,因爲生成的目標文件具有相同的名稱:Test.obj。 這將導致LNK2001未解析的外部符號,因爲其中一個Test.obj被覆蓋。

如何編寫適當的pro文件來處理?

回答

4

您應該考慮在多個項目中分割您的解決方案,但這取決於這些文件夾中的每個文件夾是否可以由其自己代表項目。 如果您選擇此解決方案,則必須爲每個項目編寫一個.pro文件。通常的方法走的是寫一個 '通用' *這是從每一個* .pro文件包含.pri文件:

folder1.pro

TEMPLATE=lib 
TARGET=folder1 
include(../common.pri) 

folder2.pro

TEMPLATE=lib 
TARGET=folder2 
include(../common.pri) 

common.pri(在父目錄中)

SOURCES += *.cpp 
HEADERS += *.h 
# etc. 

很明顯,每個pro文件的內容取決於您的解決方案。

如果你不想在多個項目中拆分源文件,我猜,更簡單的解決方案是重命名一個衝突的文件。

13

你可以嘗試添加該行到您的.pro文件:

CONFIG += object_with_source 

但作爲選項顧名思義,.OBJ文件將不會在亂源/「陰影編譯」創建目錄。

該選項已被替換爲Qt 5中的object_parallel_to_source,該選項應與影樓一起工作。

+2

注意:此功能已被刪除,http://qt.gitorious.org/qt/qtbase/commit/a72420d012fd09f0a79ae75b77eb1c3bbff75669/diffs –

+0

刪除提交的新地址:http://code.qt.io/cgit/ QT/qtbase.git /提交/?ID = a72420d012fd09f0a79ae75b77eb1c3bbff75669 – SGaist

0

我最近也遇到過這個問題。將項目拆分成子項目使得一切都變得更加複雜,至少在我第一次嘗試時,扁平化不起作用。然後我嘗試了CONFIG += object_with_sourceCONFIG += object_parallel_to_source,但兩者似乎都不適用於我的Qt版本。

所以這是我如何解決它(爲Visual Studio 2010,我不知道,如果作品與其他版本相同):

如果該項目是一個普通的Visual Studio項目,而不是一個由QMAKE產生Visual Studio 2010 & 2008 can't handle source files with identical names in different folders?(改變目標文件的輸出目錄的相對目錄通過附加在項目設置中的「C/C++」>「輸出文件」>「目標文件名」 %(RelativeDir)),如下所述,你可以解決這個問題。

很顯然,你不想做手工這每次你創建QMAKE一個新的Visual Studio項目,那麼爲什麼不使自動化呢?畢竟Visual Studio項目文件是普通的XML文件。在設置選項之前和之後查看差異顯示它保存在一個名爲ObjectFileName的獨特標籤中。

所以我寫了這Python腳本:

import sys 

filename = sys.argv[1] 
f = open(filename, "r", -1, "utf-8-sig") 
lines = f.readlines() 
f.close() 
f = open(filename, "w", -1, "utf-8-sig") 
for line in lines: 
    line = line.replace("</ObjectFileName>", "%(RelativeDir)\</ObjectFileName>") 
    f.write(line) 
f.close() 

..和使用它像這樣在我的BAT文件,我一直呼籲建立Visual Studio項目:

qmake -tp vc myproject.pro 
@cd ../scripts 
unflatten_vcproj_obj_output.py "../src/myproject.vcxproj" 
@pause 

不是一個美麗的解決方案,但它的工作。

1

一種解決方案是重命名這些文件:

A/a_Test.cpp 
B/b_Test.cpp 

這是一個有點難看,但它的簡單和類名可以保持不變。

相關問題