2

Qt5、MinGW、log4cxx との連携を試みて 2 日目です。

すべてを正常にコンパイルした後でも、apr、apr-util、および log4cxx ライブラリをリンクするとld、「未定義の参照」の問題が多数発生します。

log4cxxのコンパイル中に別の設定が指定されたようです(私はantを使用しています)。Log4cxx を MinGW で正常にコンパイルして使用できた人はいますか?

環境:

  • log4cxxトランク
  • 4 月 1.4.6
  • apr-util 1.5.2
  • 最新のMinGW
  • Qt 5 と最新の MinGW をコンパイラとして使用しています

私がやったこと:

  • 次のコマンドでantを使用してlog4cxxをコンパイルしました:「ant -Dcompiler = gcc -Dfind = false -DLOG4CXX_STATIC = 1 -Dlib.type = static」
  • pro ファイルのプロジェクトに結果ライブラリを追加しました: "LIBS += -L../log4cxx/lib LIBS += -llibapr-1 -llibaprutil-1 -lliblog4cxx"

そして今、プロジェクトをリンクしようとすると、次の結果が得られます。

*C:/mingw/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory 'C:/Work/SPP_Development/AutoHaul/Sub-systems/TCS/Source/build-SimulatorEngine-Standalone_MinGW-Debug'
g++ -Wl,-subsystem,windows -mthreads -o debug\SimulatorEngine.exe object_script.SimulatorEngine.Debug  -lmingw32 -lqtmaind -L../log4cxx/lib -llibapr-1 -llibaprutil-1 -lliblog4cxx -LC:\Qt\Qt5.0.1\5.0.1\mingw47_32\lib -lQt5XmlPatternsd -lQt5Widgetsd -lQt5Networkd -lQt5Xmld -lQt5Guid -lQt5Cored -llibEGLd -llibGLESv2d -lgdi32 -luser32 
Makefile.Debug:200: recipe for target 'debug\SimulatorEngine.exe' failed
mingw32-make[1]: Leaving directory 'C:/Work/SPP_Development/AutoHaul/Sub-systems/TCS/Source/build-SimulatorEngine-Standalone_MinGW-Debug'
Makefile:34: recipe for target 'debug' failed
../log4cxx/lib/liblog4cxx.lib(mutex.o): In function `ZN7log4cxx7helpers5MutexC2ERNS0_4PoolE':
c:/Work/log4cxx/apache-log4cxx-trunc/src/main/cpp/mutex.cpp:35: undefined reference to `apr_thread_mutex_create@12'
../log4cxx/lib/liblog4cxx.lib(mutex.o): In function `ZN7log4cxx7helpers5MutexC2EP10apr_pool_t':
c:/Work/log4cxx/apache-log4cxx-trunc/src/main/cpp/mutex.cpp:45: undefined reference to `apr_thread_mutex_create@12'
../log4cxx/lib/liblog4cxx.lib(mutex.o): In function `ZN7log4cxx7helpers5MutexD2Ev':
c:/Work/log4cxx/apache-log4cxx-trunc/src/main/cpp/mutex.cpp:55: undefined reference to `apr_thread_mutex_destroy@4'*

log4cxx ライブラリは、何らかの理由で apr ライブラリで宣言および定義された関数を見つけることができないようです。

なぜこれが起こっているのかを確認するために、問題をさらに分析する方法はありますか?

4

2 に答える 2

1

適切なリンク順序に注意する必要があります:liblog4cxxに依存するlibapr*ため、libaprエントリはの後に liblog4cxx配置する必要があります:

LIBS += -L../log4cxx/lib \
        -llog4cxx-1 \
        -lapr-1 \
        -laprutil-1

その理由は、依存関係が左から右に解決されるためです。そのため、解決が必要な外部シンボルを含む log4cxx が登場したときに apr ライブラリが読み取られ、忘れられます。ldapr ライブラリを再度読み取ることはありません (循環依存の問題と歴史的な理由に関係しています)。

これが機能するかどうかをテストするには、コマンドを実行してみてください

g++ -Wl,-subsystem,windows -mthreads -o debug\SimulatorEngine.exe object_script.SimulatorEngine.Debug  -lmingw32 -lqtmaind -L../log4cxx/lib -lliblog4cxx -llibapr-1 -llibaprutil-1 -LC:\Qt\Qt5.0.1\5.0.1\mingw47_32\lib -lQt5XmlPatternsd -lQt5Widgetsd -lQt5Networkd -lQt5Xmld -lQt5Guid -lQt5Cored -llibEGLd -llibGLESv2d -lgdi32 -luser32

ディレクトリから

C:/Work/SPP_Development/AutoHaul/Sub-systems/TCS/Source/build-SimulatorEngine-Standalone_MinGW-Debug

まず自分。しかし、おそらく.proファイルを変更するだけが最も簡単です。

于 2014-01-06T14:49:45.793 に答える
1

あなたが抱えている最初の問題を説明し、その解決策を示します。問題が解決しない場合は、元に戻さないでください。これは修正プロセスの最初のステップにすぎないためです。最終的に問題が解決するまで、修正ごとに関連するフィードバックを提供していただける限り、回答を徐々に拡大して、より多くの問題を解決します。それを下げます。それでは、始めましょう。

まず第一にLIBS、間違った方法でライブラリを変数に追加します。正しく行うには 2 つのオプションがあります。

#1

LIBS += $${PWD}/../log4cxx/lib/libapr-1.a
LIBS += $${PWD}/../log4cxx/lib/libaprutil-1.a
LIBS += $${PWD}/../log4cxx/lib/liblog4cxx-1.a

#2

LIBS += -L$${PWD}/../log4cxx/lib
LIBS += -lapr-1
LIBS += -laprutil-1
LIBS += -llog4cxx-1

注:もちろん、1 つのライナーも可能です。

LIBS += -L$${PWD}/../log4cxx/lib -lapr-1 -laprutil-1 -llog4cxx-1

注:読みやすくするために行継続 ( \) を使用することも可能です。

LIBS += -L$${PWD}/../log4cxx/lib \
        -lapr-1                  \
        -laprutil-1              \
        -llog4cxx-1
于 2013-04-10T00:21:36.857 に答える