私は過去にこの質問を別の文脈で尋ねました。私は、静的なCライブラリB(libB
)にリンクする静的C++ライブラリA(libA
)にリンクするC++アプリケーション(App
)、持っている:CMakeは共有ライブラリのリンク依存関係を私の実行可能ファイルに伝播していません
# App CMakeLists.txt
add_executable(App ${APP_HEADER_FILES} ${APP_SOURCE_FILES})
target_link_libraries(App PUBLIC LibA)
# LibA CMakeLists.txt
add_library(LibA STATIC ${LIBA_HEADER_FILES} ${LIBA_SOURCE_FILES})
target_link_libraries(LibA PUBLIC LibB)
を問題は、私はApp
を構築するときに私が得るということですリンカーエラー:"error: undefined reference to mpfit"
。 mpfit
はlibB
の関数です。私は何のリンカエラーを取得していない(CMakeのでSHARED
でSTATIC
を交換することにより)共有LibA
を作る場合
- :ここでは今、奇妙なことがあります!
共有ライブラリをすべて自分でApp
にリンクする必要があります。私はそれを試み、それは実際に働いた。しかし、ここに私の質問があります:
- CMakeは自動的にすべてのリンクの依存関係を実行可能ファイルに伝播するはずですか?これは機能の
PUBLIC
キーワードの目的ではありませんか? LibA
が共有ライブラリの場合、なぜリンカーエラーが発生しないのですか?
EDIT1:
ことができます場合:私はをすれば私が取得:
libA.cpp.o:
// ... blah blah ...
U mpfit
// ... blah blah ...
'libA'によって' libB'で使われている 'error:undefined reference'のシンボルがありますか? – UmNyobe
@UmNyobeはい、正確には – AstrOne
です。実際に何が呼び出されているかを見るには[詳細な出力](http://stackoverflow.com/questions/37994484)を使うことができるGNUツールチェーン(例えば、Windowsプラットフォーム上では[異常な回避策](https://github.com/Kitware/) CMake/blob/master/Modules/Platform/Windows-GNU.cmake#L133)がそこにあります)。一般的に、 'STATIC'と' SHARED'の違いは、 'SHARED'LibAに実際にLibBがリンクされていることです。 – Florian