4

Linux上のc ++でQT Creatorでアプリケーションを開発しています

一連のアプリケーション全体でいくつかの共通クラスを使用できるように、独自のライブラリを作成しました。

私が作成したライブラリでは、別の外部スタティック ライブラリ (libSDL.a) を使用しました。ライブラリを静的ライブラリ (*.a) に構成しましたが、問題なくコンパイルされます。

次に、ライブラリを別のアプリケーションに追加し、いくつかのクラスを使用しました。アプリケーションをコンパイルしようとすると、ライブラリ内から他のライブラリへの関数呼び出しへの未定義の参照が取得されます。

私の理解では、静的ライブラリはコンパイル中にコピーされると想定されています。自分のライブラリにコピーする必要があるライブラリへの未定義の参照を取得するのはなぜですか?

*.pro ファイルでライブラリ プロジェクトを構成する方法を次に示します。

QT -= gui
TARGET = FoobarTools
TEMPLATE = lib
CONFIG += staticlib
CONFIG -= shared
DEFINES += FOOBARTOOLS_LIBRARY
INCLUDEPATH += ./include/SDL_Headers/
LIBS += -L./bin/ -lSDL
SOURCES += ...
HEADERS += ...

私のアプリケーション *.pro ファイルが私のライブラリをどのように使用しているかは次のとおりです。

QT -= gui
TARGET = FoobarApp
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
INCLUDEPATH += ./include/
LIBS += -L./bin/ -lFoobarTools
SOURCES += ...
HEADERS += ...
4

3 に答える 3

1

アプリケーションの .pro には次のものが必要です。

INCLUDEPATH += LibraryPath(これは、ヘッダー ファイルのディレクトリを指します。)

DEPENDPATH += LibraryPath(これは、ヘッダー ファイルのディレクトリも指します。)

LIBS += -LDebugOrReleasePath -lLibraryName(これは、先頭の「lib」と末尾の「.a」を除いた lib-filename です。)

それが完了したら、カスタム ライブラリへの #includes がまだ機能しているかどうかを確認します。

静的ライブラリの .pro ファイルでは、何も変更する必要はありません。おそらく「CONFIG += release」を追加してください。

于 2012-06-08T18:09:56.223 に答える
-1

ここで答えを見つけることができると思います:

http://gcc.gnu.org/ml/gcc-help/2004-04/msg00104.html

そして、より正確には、このフォローアップで:

http://gcc.gnu.org/ml/gcc-help/2004-04/msg00106.html

私は今それをテストすることはできませんが、考えられる原因はこれによって再開される可能性があると思います:

「リンカーは、ライブラリに遭遇した場合、ライブラリを「破棄」しますが、定義されているシンボルは必要ありません」

応急処置として、-lSDL を 2 番目の .pro ファイルに追加します。

編集: 静的ライブラリ (最初の .pro ファイル) が実際に libSDL のいくつかのシンボルを使用していると確信していますか? そうでない場合、コンパイラは単に libSDL.a ファイルを無視し、スタティック ライブラリに含めません。libSDL.a のいくつかのシンボルを使用しても、それらの関数のみが実行可能ファイルにコピーされ、他のシンボルはコピーされません (少なくとも、これは私が思うことです)。「静的ライブラリには、リンクに関して特別な規則があります。静的ライブラリのオブジェクトは、オブジェクトが未解決のシンボルを提供する場合にのみバイナリに追加されます。」(参照: https://stackoverflow.com/a/2649792/1284631)。次に、実行可能ファイル (2 番目の .pro ファイル) が libSDL からコピーされていないシンボルを使用すると、エラーが発生します。同じソースの引用: 「Linux では、 --whole-archive リンカー オプションを使用してその動作を変更できます: g++ -Wl,--whole-archive some_static_lib.a -Wl,--no-whole-archive」。このようにして、静的な libSDL.a アーカイブ全体を自分のアーカイブ内に確実に運ぶことができます。

于 2012-06-03T22:04:51.423 に答える