Hen*_*cer 11 c++ linker multiple-definition-error qt-creator
这是我的.pro文件:
QT += core gui widgets
TARGET = link_mult_def
TEMPLATE = app
SOURCES += main.cpp \
path2/file.cpp \
path1/file.cpp
HEADERS +=
Run Code Online (Sandbox Code Playgroud)
出于某种原因,QtCreator在从.cpp文件构建.o文件时不尊重源文件夹结构.这两个文件都将编译为"shadow_build_directory/file.o".我希望构建过程在shadow构建目录中创建path1和path2目录,并将"path1/file.cpp"编译为"shadow_build_directory/path1/file.o",将"path2/file.cpp"编译为"shadow_build_directory/path2 /" file.o".
由于来自两个来源的编译符号在文件中加起来,因此它还不是一个大问题.当QtCreator尝试链接时,它成为一个大问题:
g++ -Wl,-O1 -o link_mult_def main.o file.o file.o -L/usr/lib/x86_64-linux-gnu -lQtCore -lpthread
Run Code Online (Sandbox Code Playgroud)
QtCreator链接file.o两次,这使得链接器失败并出现多个定义错误.
如何确保QtCreator编译为反映源目录结构的目标文件?
谢谢
编辑:
路径1/file.cpp
#include <iostream>
void function1()
{
std::cout << "function1" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
路径2/file.cpp
#include <iostream>
void function2()
{
std::cout << "function2" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我过去在使用 Visual Studio 时也遇到过同样的问题。它的作用是编译所有目标文件并将其放置在一个目录中,就像您的情况一样。我们通过在项目中不使用重复的文件名来解决这个问题。
如果您所说的是真的 - QtCreator 将所有目标文件放在一个目录中,那么您所能做的就是使用每个项目的唯一名称来命名您的文件。
| 归档时间: |
|
| 查看次数: |
4467 次 |
| 最近记录: |