11

これは私の .pro ファイルです:

QT       += core gui widgets

TARGET = link_mult_def

TEMPLATE = app

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

HEADERS +=

何らかの理由で、QtCreator は .cpp ファイルから .o ファイルを構築するときにソース フォルダー構造を尊重しません。両方のファイルが「shadow_build_directory/file.o」にコンパイルされます。ビルド プロセスがシャドウ ビルド ディレクトリに path1 および path2 ディレクトリを作成し、"path1/file.cpp" を "shadow_build_directory/path1/file.o" に、"path2/file.cpp" を "shadow_build_directory/path2/" にコンパイルすることを期待します。 file.o".

両方のソースからコンパイルされたシンボルが 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

QtCreator は file.o を 2 回リンクするため、リンカーは複数の定義エラーで失敗します。

QtCreator がソース ディレクトリ構造を反映するオブジェクト ファイルにコンパイルされることを確認するにはどうすればよいですか?

ありがとう

編集:

path1/file.cpp

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

path2/file.cpp

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

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
4

4 に答える 4

1

If you're comfortable having your object files alongside your source files, then you can use either

CONFIG += object_parallel_to_source

or

CONFIG += object_with_source

depending on which version of QMake you're using.

Answer cribbed from SO answer here.

于 2016-04-15T16:44:08.870 に答える
0

過去にVisualStudioでまったく同じ問題が発生しました。あなたの場合と同じように、すべてのオブジェクトファイルをコンパイルして1つのディレクトリに配置します。プロジェクトにファイル名が重複しないようにすることで、この問題を回避しました。

QtCreatorがすべてのオブジェクトファイルを1つのディレクトリに配置するというあなたの言うことが真実である場合、あなたができることは、プロジェクトごとに一意の名前でファイルに名前を付けることだけです。

于 2012-09-11T09:30:33.730 に答える
0

おそらく、プロジェクト全体を 2 つに分割し (既存のソース ファイルの構成に手を加えることなく、.pro ファイルを管理するだけ)、それらの間の依存関係をセットアップすることができます。次に、プロジェクトごとに独自の出力ビルド ファイル ディレクトリを設定できます (たとえば、こちらを参照してください)。

于 2012-09-11T09:59:55.970 に答える
-1

解決策は、ファイルの名前を変更することです。プロジェクトのディレクトリとディレクトリ構造は、コンパイラとは関係ありません。コンパイラは、ファイルがどこにあるかを気にしません。ファイルがフォルダにあるか月にあるかに関係なく、ファイルを取得する必要があるだけです。/src

明らかに.o、同じ名前のファイルが2つあるという理由だけで、ファイルが作成された後にエラーが発生します。

この問題がなかったとしても、同じ名前の複数のファイルを作成するのは良くありませんfile.cpp

于 2012-09-11T09:41:16.723 に答える