2

2つのサブプロジェクト(Sub1とSub2)を持つプロジェクトがあります:

ESI
|
|__Sub1
|
|__Sub2

Sub2(demo1.cpp)プロジェクトのクラスの実装ファイル(.cpp)に、Sub1プロジェクトのクラスを含める必要があります。したがって、demo1.cppで私は次のように宣言しました。

#include "../sub1/controller.h"

リンカがコントローラのコンストラクタを見つけられないのはなぜですか?(未定義の参照を言います)

ありがとう

4

1 に答える 1

2

Yourは、クラスの定義(つまり、ファイルの内容)を見つけることができる場所をコンパイラ#includeに伝えます。controllercontroller.h

クラスの実装に向けてリンクするためにcontroller、リンカーは既にコンパイルされた実装を含むライブラリを必要とします。- のファイルをプロジェクトに含めない限り、プロジェクトは の内容を再度Sub2コンパイルしませんが、これは悪い習慣であり、さらなる問題につながる可能性があります。Sub1.cppSub1Sub2


Sub1次のように生成されるライブラリであると仮定しsub1.libます。

プロジェクトの.proファイルに次の行を追加する必要があります。Sub2

LIBS += -L../Sub1 \
        -lsub1

これは、ライブラリを含む ".​​./Sub1" ディレクトリがあり、"sub1.lib" という名前のライブラリがあることをリンカに伝えます。-Land構文を使用する利点-lは、これがすべてのプラットフォーム (Windows、Linux、Mac など) で機能することです。


Sub1との両方Sub2が実行可能 (つまり、プロジェクトが.exe) ファイルを生成する場合、共通のコンテンツを別のプロジェクトに抽出する必要がSub3ありTEMPLATE = libます。TEMPLATE = app.pro

于 2013-01-21T12:10:51.400 に答える