2011-10-14 23 views
14

Dự án Qt của tôi có hai tệp nguồn có cùng tên nhưng trong thư mục khác. Các tập tin pro là:Cách sử dụng qmake với hai tệp nguồn có cùng tên?

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

Nó có thể tạo ra tập tin Visual Studio giải pháp thông qua Qt Visual Studio addon, nhưng nó sẽ không làm việc vì các đối tượng tập tin được tạo ra có cùng tên: Test.obj. Điều đó sẽ gây ra LNK2001 biểu tượng bên ngoài chưa được giải quyết vì một trong các Test.obj bị ghi đè.

Cách viết tệp chuyên nghiệp thích hợp để xử lý?

Trả lời

4

Bạn nên xem xét tách giải pháp của mình trong nhiều dự án, nhưng tùy thuộc vào việc mỗi một trong các thư mục đó có thể đại diện cho một dự án hay không. Nếu bạn chọn giải pháp này, bạn sẽ phải viết một tệp .pro cho mỗi dự án. Cách thông thường để đi là để viết một 'chung' * tập tin .pri được bao gồm từ mọi file * .pro:

folder1.pro

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

folder2.pro

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

common.pri (trong thư mục chính)

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

Rõ ràng là nội dung của mỗi tệp chuyên nghiệp phụ thuộc vào giải pháp của bạn.

Nếu bạn không muốn chia tệp nguồn trong nhiều dự án, giải pháp dễ dàng hơn là đổi tên một tệp xung đột, tôi đoán vậy.

13

Bạn có thể thử thêm dòng đó vào tập tin .pro của bạn:

CONFIG += object_with_source 

Nhưng như tên tùy chọn ngụ ý, các file .obj sẽ không được tạo ra trong out-of-source/"shadow build" danh mục.

Tùy chọn đó đã được thay thế bằng object_parallel_to_source trong Qt 5, sẽ hoạt động với tòa nhà bóng tối.

+2

Lưu ý: Tính năng này đã bị xóa, http://qt.gitorious.org/qt/qtbase/commit/a72420d012fd09f0a79ae75b77eb1c3bbff75669/diffs –

+0

Địa chỉ mới cho cam kết xóa: http://code.qt.io/cgit/ qt/qtbase.git/commit /? id = a72420d012fd09f0a79ae75b77eb1c3bbff75669 – SGaist

0

Gần đây tôi cũng đã xem xét vấn đề này. Chia dự án thành các tiểu dự án khiến mọi thứ trở nên phức tạp hơn nhiều, và ít nhất là trong nỗ lực đầu tiên của tôi không thành công. Sau đó, tôi đã thử CONFIG += object_with_sourceCONFIG += object_parallel_to_source, nhưng cả hai dường như không hoạt động với phiên bản Qt của tôi.

Vì vậy, đây là cách tôi giải quyết nó (cho Visual Studio 2010, tôi không biết nếu công trình tương tự với các phiên bản khác):

Nếu dự án là một dự án Visual Studio bình thường, không phải là một tạo ra bởi qmake , bạn có thể giải quyết nó như được mô tả ở đây: Visual Studio 2010 & 2008 can't handle source files with identical names in different folders? (thay đổi thư mục đầu ra của tệp đối tượng thành một thư mục tương đối bằng cách thêm %(RelativeDir) trong cài đặt dự án "C/C++"> "Tệp đầu ra"> "Tên tệp đối tượng").

Rõ ràng, bạn không muốn làm điều này bằng tay mỗi khi bạn tạo một dự án Visual Studio mới với QMake, vậy tại sao không tự động hóa nó? Sau khi tất cả các tệp dự án Visual Studio là các tệp XML thông thường. Nhìn vào sự khác biệt trước và sau khi thiết lập các tùy chọn cho thấy nó được lưu trong một thẻ duy nhất gọi là ObjectFileName.

Vì vậy, tôi đã viết kịch bản Python này:

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() 

..và sử dụng nó như thế này trong bat-file của tôi mà tôi luôn gọi để tạo ra các dự án Visual Studio:

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

Không phải là một giải pháp đẹp, nhưng nó hoạt động.

1

Một giải pháp là để đổi tên các tập tin:

A/a_Test.cpp 
B/b_Test.cpp 

Đó là một chút xấu xí, nhưng và tên lớp đơn giản của nó có thể giữ nguyên.

Các vấn đề liên quan