이 내 .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
실제로 qmake를 사용하는 QtCreator와 같은 방식입니다. 나는 qmake에게 아무 것도 말하지 않는다. 난 그냥 내 프로젝트에 소스 파일을 추가합니다. 내 실행 파일을 빌드하려면 모든 파일이 필요합니다. 그러나 프로젝트를 만들 때 실패합니다. – HenrySpencer
나는 소스 코드가 괜찮다는 것을 확신한다. QtCreator에 문제가 있습니다. 보시다시피 두 소스 파일은 링커 호출에서 두 번 나타나는 동일한 객체 파일로 컴파일됩니다. 따라서 여러 정의 오류가 발생합니다. QtCreator가 객체 파일을 분리하도록 컴파일하는 방법을 모른다. – HenrySpencer
죄송합니다. 하위 디렉토리에서 같은 파일 이름을 사용하는 것을 보지 못했습니다. – Mat