2012-11-01 20 views
7

Tôi có một dự án với một số thư mục có chứa tệp nguồn có cùng tên.Qmake: Tránh xung đột tên tệp trong các thư mục khác nhau mà không cần giới thiệu thư viện

cây nguồn của tôi trông như thế này:

project.pro 

foo/ 
    conflict.h 
    conflict.cpp 

bar/ 
    conflict.h 
    conflict.cpp 

some.h 
other.h 
files.h 
main.cpp 

mỗi mặc định, qmake tạo ra một Makefile mà sẽ tạo ra một cây xây dựng như thế này:

conflict.o 
main.o 
target 

đâu conflict.o là đối tượng tập tin kết quả cho cả hai foo/conflict.cppfoo/conflict.h.

Tôi không thể đổi tên vì chúng được tạo bằng công cụ bên ngoài và buộc tên tệp khác nhau ngụ ý thay đổi nội dung của chúng, vì vậy đây không phải là tùy chọn.

Tôi cũng không muốn sử dụng qmake SUBDIRS mẫu vì điều này sẽ có nghĩa là (1) mỗi subdir được xây dựng riêng biệt như một thư viện và do đó rất nhiều phức tạp quá trình xây dựng tổng thể (trong mắt tôi ít nhất) và (2) trong thư mục cấp cao nhất tôi không thể có bất kỳ tệp nguồn nào. Hoặc là tôi sai?

Tôi không thể nói qmake để ghi các tệp đối tượng vào các thư mục riêng biệt trong thư mục xây dựng? Vì vậy, cây xây dựng của tôi sẽ trông giống như sau:

foo/ 
    conflict.o 

bar/ 
    conflict.o 

main.o 
target 

Hoặc có giải pháp nào khác không yêu cầu đổi tên tệp nguồn hay giới thiệu điều gì đó phức tạp như thư viện tĩnh không? Tôi không thể tin rằng Qt đã không giải quyết vấn đề này (trong mắt tôi đơn giản) trong nhiều năm. (Tôi đã gặp vấn đề này cách đây 4 năm nhưng có thể đổi tên các tệp trong dự án đó, trong khi ở đây tôi không thể.)

Nếu điều quan trọng: tôi sử dụng Qt 4.8 trên cả Ubuntu với G ++ và Windows với mingw32.

+0

Không thể thực hiện được. –

+0

@NikosC. Tôi có thể có một tập tin chuyên nghiệp cho các tập tin cấp cao nhất mà sẽ liên kết với các thư viện khác + một tập tin chuyên nghiệp SUBDIRS cấp cao nhất mà sẽ có subdir '.'? Điều này sẽ yêu cầu tôi cũng ghi đè lên tập tin .pro cho subdir này để được một cái gì đó khác với tập tin .pro cấp cao nhất cho toàn bộ ứng dụng. Tôi hi vọng bạn hiểu những gì tôi nói. Tôi chỉ muốn tránh rằng tôi phải di chuyển tất cả các tập tin cấp cao nhất vào một thư mục con vật lý. – leemes

+0

Bạn có thể chỉ sử dụng một tệp dự án bổ sung cho 'foo' và giữ cho tệp hiện tại của bạn cho thư mục cấp cao nhất và' bar'. Một tùy chọn khác là symlink tên tệp xung đột: 'ln -s bar/conflict.cpp bar/conflict_bar.cpp' và sau đó sử dụng liên kết tượng trưng trong tệp dự án. –

Trả lời

2

Bạn có bị ràng buộc với qmake không? Nếu không, một giải pháp thay thế có thể là sử dụng cmake. Tôi vừa xác minh trang của bạn với một CMakeLists.txt đơn giản như

cmake_minimum_required (VERSION 2.6) 
project (conflict) 
add_executable(conflict foo/conflict.cpp bar/conflict.cpp main.cpp) 

thậm chí bao gồm tệp nguồn trong thư mục cấp cao nhất (main.cpp). Đây đúng cách xây dựng thực thi - các tập tin đối tượng được tạo ra trong thư mục phụ như

./CMakeFiles/conflict.dir/main.cpp.o 
./CMakeFiles/conflict.dir/bar/conflict.cpp.o 
./CMakeFiles/conflict.dir/foo/conflict.cpp.o 

cmake cũng bao gồm hỗ trợ cho Qt4, để tự động lấy các đường dẫn và thư viện cần thiết bao gồm. Nó có thể đòi hỏi một số nỗ lực để di chuyển từ qmake để cmake, nhưng đưa ra các yêu cầu bạn có tôi sẽ cung cấp cho nó một thử.

+0

Sự cố là cho các tập tin mã được tạo ra cũng là một tập tin .pri được tạo ra để giúp ràng buộc tất cả các tập tin được tạo ra cho một dự án thực tế. Nhưng kể từ khi bộ tạo mã được viết bởi tôi, tôi có thể viết lại nó để sử dụng cmake, tuy nhiên, điều này thậm chí còn phức tạp hơn việc sử dụng các subdir của qmake, tôi nghĩ vậy. Nhưng đây có thể là giải pháp tốt cho những người dùng khác, vì vậy câu trả lời của bạn rất phù hợp :) – leemes

+0

Quá xấu;) Sau đó, có lẽ cách dễ nhất là sử dụng các thư mục con, có thể xây dựng các thư viện tĩnh và cuối cùng liên kết chúng lại với nhau. –

+0

Vâng. Nhưng tôi muốn có một dự án gốc mà không phải là một dự án subdirs nhưng vẫn sẽ phụ thuộc vào việc xây dựng các subdirs ... Tôi không biết làm thế nào tôi có thể làm điều này. – leemes

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