2012-09-11 2 views
11

이 내 .PRO 파일 다음의 .cpp 파일에서 .o 인 파일을 만들 때QtCreator 여러 정의 빌드 버그

QT  += core gui widgets 

TARGET = link_mult_def 

TEMPLATE = app 

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

HEADERS += 

몇 가지 이유를 들어, QtCreator는 소스 폴더 구조를 존중하지 않습니다. 두 파일 모두 "shadow_build_directory/file.o"로 컴파일됩니다. 빌드 프로세스가 섀도우 빌드 디렉토리에 path1 및 path2 디렉토리를 작성하고 "shadow1/file.cpp"를 "shadow_build_directory/path1/file.o"로 컴파일하고 "path2/file.cpp"를 "shadow_build_directory/path2/file.o ".

두 소스의 컴파일 된 기호가 file.o에 추가되므로 큰 문제는 아닙니다.

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

QtCreator 링크는 링커하여 여러개의 정의 오류로 실패하게 두 번 file.o : QtCreator 링크하려고하면 그것은 큰 문제가된다.

QtCreator가 원본 디렉터리 구조를 반영하는 개체 파일로 컴파일되도록하려면 어떻게해야합니까?

감사

편집 : QtCreator으로

경로 1/file.cpp

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

경로 2/file.cpp

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

빌드 과정 :

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

실제로 qmake를 사용하는 QtCreator와 같은 방식입니다. 나는 qmake에게 아무 것도 말하지 않는다. 난 그냥 내 프로젝트에 소스 파일을 추가합니다. 내 실행 파일을 빌드하려면 모든 파일이 필요합니다. 그러나 프로젝트를 만들 때 실패합니다. – HenrySpencer

+0

나는 소스 코드가 괜찮다는 것을 확신한다. QtCreator에 문제가 있습니다. 보시다시피 두 소스 파일은 링커 호출에서 두 번 나타나는 동일한 객체 파일로 컴파일됩니다. 따라서 여러 정의 오류가 발생합니다. QtCreator가 객체 파일을 분리하도록 컴파일하는 방법을 모른다. – HenrySpencer

+0

죄송합니다. 하위 디렉토리에서 같은 파일 이름을 사용하는 것을 보지 못했습니다. – Mat

답변

0

이전에는 Visual Studio에서 똑같은 문제가있었습니다. 그것이하는 일은 당신의 경우와 마찬가지로 모든 오브젝트 파일을 컴파일하고 하나의 디렉토리에 저장하는 것입니다. 우리는 프로젝트에서 중복 된 파일 이름을 가지지 않음으로써이를 해결했습니다.

당신이 말한 것이 사실이라면 - QtCreator가 모든 객체 파일을 하나의 디렉토리에 저장하면 모든 파일을 프로젝트마다 고유 한 이름으로 지정할 수 있습니다.

+0

QtCreator에서 빌드 단계를 추가했습니다. 동일한 오브젝트 파일로 컴파일된다는 것을 알 수 있습니다. 불행히도 내 코드가 아니기 때문에 원본 구조를 변경할 수 없습니다. – HenrySpencer

-1

해결책은 파일의 이름을 바꾸는 것입니다. 프로젝트의 디렉토리와 디렉토리 구조는 컴파일러와 함께이 아닌 입니다. 컴파일러는 파일이 어디에 있든 관계없이 심지어 파일이 /src 폴더에 있는지, 아니면 달에 있는지에 관계없이 파일을으로 가져와야합니다.

분명히 .o 파일을 만든 후에는 동일한 이름의 두 파일이 있기 때문에 오류가 발생합니다.

이 문제가 없더라도 동일한 이름의 파일을 여러 개 만드는 것은 좋지 않습니다. 특히 이름이 의미가없는 경우는 file.cpp입니다.

+0

코드가 내 코드가 아니며 코드 구조를 변경하면 안되므로 파일 이름을 변경하면 안됩니다. 파일 이름을 바꾸기 시작하면 사람들이 나를 죽일 것입니다. 나는 문제가있다, 우리는 소스 파일이 디렉토리에 분리되어 있지만 빌드 프로세스는 같은 방식으로 객체 파일을 분리하지 않는다고 생각한다. – HenrySpencer

+4

"이 문제가 없다고해도 같은 이름을 가진 파일을 여러 개 만드는 것은 좋지 않습니다. 특히 이름이 의미가 없으면 file.cpp와 같이 사용하십시오." 최소한의 예제를 만들었습니다. 즉, 파일 이름이 "file.cpp"인 이유입니다. 같은 이름의 파일을 가지고있는 것이 좋지 않다고 생각합니다. 그래서 우리는 파일 시스템에 디렉토리를 가지고 있습니다. hundres의 하위 디렉토리에 소스 코드가 분산되어있는 거대한 프로젝트를 상상해보십시오. 서로 다른 팀이 서로 다른 하위 디렉토리에서 작업하고 있으며 다른 하위 디렉토리와 동일한 파일 이름을 사용하지 않도록 말할 수 없습니다. – HenrySpencer

0

아마도 전체 프로젝트를 두 개로 나눌 수 있으며 (기존 소스 파일 구성을 건드리지 않고 .pro 파일을 관리하는 것만으로) 이들 사이의 종속성을 설정할 수 있습니다. 그런 다음 각 프로젝트에 대해 자신 만의 출력 빌드 파일 디렉토리를 설정할 수 있습니다 (예 : here 참조).

1

당신이 당신의 소스 파일과 함께 귀하의 오브젝트 파일을 가지고 편안 경우, 다음 중 하나를

CONFIG += object_parallel_to_source 

또는

CONFIG += object_with_source 

로 qmake의 버전에 따라 사용중인 사용할 수 있습니다.

답글은 SO answer here입니다.