2012-09-11 31 views
11

đây là tập tin .pro tôi:QtCreator nhiều nét build lỗi

QT  += core gui widgets 

TARGET = link_mult_def 

TEMPLATE = app 

SOURCES += main.cpp \ 
      path2/file.cpp \ 
      path1/file.cpp 

HEADERS += 

Đối với một số lý do, QtCreator không tôn trọng cấu trúc thư mục nguồn khi xây dựng các tập tin .o từ các tập tin cpp. Cả hai tập tin sẽ được biên dịch thành "shadow_build_directory/file.o". Tôi mong đợi quá trình xây dựng để tạo các thư mục path1 và path2 trong thư mục shadow build và biên dịch "path1/file.cpp" thành "shadow_build_directory/path1/file.o" và "path2/file.cpp" thành "shadow_build_directory/path2/file.o ".

Vì các biểu tượng được biên dịch từ cả hai nguồn sẽ thêm vào tệp. Do đó, đây không phải là một vấn đề lớn. Nó trở thành một vấn đề lớn khi QtCreator cố gắng liên kết:

g++ -Wl,-O1 -o link_mult_def main.o file.o file.o -L/usr/lib/x86_64-linux-gnu -lQtCore -lpthread 

liên kết QtCreator file.o hai lần mà làm cho mối liên kết thất bại với mutiple lỗi định nghĩa.

Làm cách nào để đảm bảo rằng QtCreator biên dịch để phản đối các tệp phản ánh cấu trúc thư mục nguồn?

Cảm ơn

EDIT:

path1/file.cpp

#include <iostream> 
void function1() 
{ 
    std::cout << "function1" << std::endl; 
} 

path2/file.cpp

#include <iostream> 
void function2() 
{ 
    std::cout << "function2" << std::endl; 
} 

quá trình xây dựng bởi QtCreator:

g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../link_mult_def -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I../link_mult_def -I. -o main.o ../link_mult_def/main.cpp 

g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../link_mult_def -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I../link_mult_def -I. -o file.o ../link_mult_def/path1/file.cpp 

g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../link_mult_def -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I../link_mult_def -I. -o file.o ../link_mult_def/path2/file.cpp 

g++ -Wl,-O1 -o link_mult_def main.o file.o file.o -L/usr/lib/x86_64-linux-gnu -lQtGui -lQtCore -lpthread 

file.o: In function `function2()': 
file.cpp:(.text+0x0): multiple definition of `function2()' 
make: Leaving directory `/home/schmid/code/misc/trash/link_mult_def-build-desktop-Qt_4_8_1_in_PATH__System__Release' 
file.o:file.cpp:(.text+0x0): first defined here 
collect2: error: ld returned 1 exit status 
make: *** [link_mult_def] Error 1 
+1

Thực ra đó là cách QtCreator sử dụng qmake. Tôi không nói gì với qmake cả. Tôi chỉ cần thêm các tệp nguồn vào dự án của mình. Tôi cần tất cả các tệp để xây dựng tệp thực thi của mình. Nhưng khi tôi xây dựng dự án nó thất bại. – HenrySpencer

+0

tôi khá chắc chắn rằng mã nguồn là tốt. Đó là một vấn đề với QtCreator. Vì bạn có thể thấy cả hai tệp nguồn được biên dịch thành cùng một tệp đối tượng xuất hiện hai lần trong lời gọi trình liên kết. Dẫn đến lỗi định nghĩa mutliple. Tôi không biết làm thế nào để nói với QtCreator để biên dịch để tách các tập tin đối tượng. – HenrySpencer

+0

Xin lỗi về điều đó, tôi đã không nhìn thấy bạn sử dụng cùng một tên tập tin trong các thư mục con ... xin lỗi vì tiếng ồn. – Mat

Trả lời

0

Tôi đã gặp sự cố tương tự với Visual Studio trong quá khứ. Những gì nó làm là nó biên dịch và đặt tất cả các tập tin đối tượng trong một thư mục, giống như trong trường hợp của bạn. Chúng tôi đã làm việc xung quanh điều đó bằng cách không có tên tệp trùng lặp trong một dự án.

Nếu những gì bạn nói là đúng - QtCreator đặt tất cả các tệp đối tượng trong một thư mục, thì tất cả những gì bạn có thể làm là đặt tên tệp của bạn với tên duy nhất cho mỗi dự án.

+0

Tôi đã thêm các bước xây dựng từ QtCreator. Bạn có thể thấy rằng nó biên dịch vào cùng một tệp đối tượng. Rất tiếc, tôi không được phép thay đổi cấu trúc nguồn vì đó không phải là mã của tôi ... – HenrySpencer

-1

Giải pháp sẽ chỉ là đổi tên tệp của bạn. Các thư mục và cấu trúc thư mục của dự án của bạn có không có gì để làm với trình biên dịch. Trình biên dịch thậm chí không quan tâm nơi các tập tin được, nó chỉ cần nhận được các tập tin, không có vấn đề nếu các tập tin nằm trong thư mục /src, hoặc trên Mặt trăng.

Bây giờ rõ ràng, sau khi các tệp .o được thực hiện, bạn nhận được lỗi, đơn giản chỉ vì bạn có hai tệp cùng tên.

Ngay cả khi bạn không gặp phải vấn đề này, việc tạo các tệp nhân với cùng tên là xấu, đặc biệt nếu các tên là vô nghĩa, như file.cpp.

+0

Tôi không được đổi tên tệp vì đó không phải là mã của tôi và tôi không được thay đổi cấu trúc mã. Mọi người sẽ giết tôi nếu tôi bắt đầu đổi tên tệp. Tôi nghĩ rằng vấn đề là, rằng chúng tôi có tập tin nguồn tách trong thư mục nhưng quá trình xây dựng không tách riêng các tập tin đối tượng trong cùng một cách. – HenrySpencer

+4

"Ngay cả khi bạn không có vấn đề này, làm cho các tập tin nhân với cùng tên là xấu, đặc biệt là nếu các tên là vô nghĩa, như file.cpp." Tôi đã tạo một ví dụ tối thiểu, đó là lý do tại sao các tệp được đặt tên là "file.cpp". Tôi không nghĩ rằng nó là xấu để có tập tin có cùng tên. Đó là lý do tại sao chúng tôi có các thư mục trong các hệ thống tệp. Hãy tưởng tượng một dự án lớn với mã nguồn được phân phối trên hundres của các thư mục con. Bạn có các nhóm khác nhau làm việc trên các thư mục con khác nhau và bạn không thể yêu cầu họ không sử dụng cùng tên tệp như trong các thư mục con khác ... – HenrySpencer

0

Có lẽ bạn có thể chia toàn bộ dự án thành hai (không chạm vào cấu hình tệp nguồn hiện có, chỉ quản lý tệp .pro) và thiết lập phụ thuộc giữa chúng. Sau đó, đối với mỗi dự án bạn có thể đặt thư mục tệp xây dựng đầu ra của riêng mình (xem, ví dụ: here).

1

Nếu bạn cảm thấy thoải mái khi các file đối tượng của bạn cùng với các file nguồn của bạn, sau đó bạn có thể sử dụng một trong hai

CONFIG += object_parallel_to_source 

hoặc

CONFIG += object_with_source 

tùy thuộc vào phiên bản của qmake bạn đang sử dụng.

Trả lời giường cũi từ SO answer here.