2012-05-03 38 views
1

私のC++アプリケーションでは、システム、filsystem、timer、chronoをライブラリにリンクする静的ライブラリ(libCOMMON.a)があります。他の静的ライブラリにリンクする静的ライブラリに動的ライブラリをリンクする

ADD_LIBRARY(COMMON ${COMMON_SRCS}) 
target_link_libraries(COMMON 
    ${BOOST_LIB_DIR}/libboost_filesystem.a 
    ${BOOST_LIB_DIR}/libboost_system.a 
    ${BOOST_LIB_DIR}/libboost_timer.a 
    ${BOOST_LIB_DIR}/libboost_chrono.a 
) 

私もlibCOMMON.aにリンクこのアプリケーションのプラグインを持っている:私はここにCMakeを使用しています

は、どのように私が作成し、リンクlibCOMMON.aです。プラグインは動的ライブラリとして構築されています。すべてが正常にコンパイルされますが(gccを使用)、アプリケーションを起動すると、ブーストに関連するダイナミックライブラリのいくつかのシンボルを解決できないため、プラグインをロードできません。

解決策は、ブーストするために各プラグインをリンクすることでした。より良い方法がありますか? 私は、ブーストライブラリがlibCOMMON.aに静的にリンクされていれば、libCOMMON.aにプラグインをリンクすれば十分だろうと考えました。

誰かが何が起こっているのか説明できますか?

おかげ

+0

libCOMMON.aの作成に使用されたコマンドを表示できますか?この問題を解決するにはいくつかの方法があります。 – Flexo

+0

私はそれを行うためにCMakeを使用しています:ADD_LIBRARY(COMMON $ {COMMON_SRCS})。私は質問を編集し、詳細を追加しました。 – nbilal

+0

静的ライブラリを他の静的ライブラリに「リンク」することはできません。静的ライブラリはオブジェクトファイルの集合です。他のライブラリを参照する仕組みはありません。いくつかの小さなライブラリから大きなライブラリを作成することもできますが、それは情報の重複を無駄にすることになります。 –

答えて

0

私はこの問題は、ブーストライブラリは、デフォルトでは動的ライブラリとして構築されているということだと思います。 ".a"が静的ライブラリとしてビルドされている場合でも、boostのlibフォルダにはそれぞれ ".a"の ".so"ライブラリが含まれています。つまり、libCOMMON.aは動的にリンクしてライブラリを強化します。このため、libCOMMON.aに静的にリンクしているプラ​​グインも、ブーストライブラリに動的にリンクしています。より良い解決策は、ブーストライブラリを静的ライブラリとして構築することです。

関連する問題