2011-10-14 10 views
14

My Qtプロジェクトには、同じ名前で異なるフォルダに2つのソースファイルがあります。 プロファイルは次のとおりです。同じ名前の2つのソースファイルでqmakeを使用するには?

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

それはQtのVisual Studioのアドオンを経由してVisual Studioのソリューションファイルを生成することができますが、生成されたオブジェクトファイルが同じ名前持っているので、それは動作しません:TEST.OBJを。 これにより、Test.objの1つが上書きされるため、LNK2001未解決の外部シンボルが発生します。

これに対処するための適切なプロファイルを書くにはどうすればよいですか?

答えて

4

複数のプロジェクトでソリューションを分割することを検討する必要がありますが、それぞれのフォルダがそれぞ​​れ独自のプロジェクトを表すことができるかどうかによって異なります。 このソリューションを選択した場合は、プロジェクトごとに1つの.proファイルを作成する必要があります。

folder1.pro

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

folder2.pro

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

:行くための通常の方法は、すべて* .PROファイルから含まれている '一般的な' *の.priファイルを作成することですcommon.pri

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

(親ディレクトリに)明らかに、各プロファイルの内容はあなたのソリューションに依存します。

ソースファイルを複数のプロジェクトに分割したくない場合は、競合するファイルの名前を変更するほうが簡単です。

13

あなたの.PROファイルにその行を追加してみてくださいすることができます

CONFIG += object_with_source 

しかし、オプション名が示すように、.OBJファイルは、アウトソース/「影のビルド」で作成されませんディレクトリ。

このオプションはQt 5のobject_parallel_to_sourceに置き換えられています。このQtはシャドウビルディングで動作するはずです。

+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はによって生成された1だった場合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() 

を..and私はいつもの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 

それは少し醜いですが、そのシンプルでクラス名が同じ滞在することができます。

関連する問題