2016-06-23 20 views
3

私は過去にこの質問を別の文脈で尋ねました。私は、静的な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"mpfitlibBの関数です。私は何のリンカエラーを取得していない(CMakeのでSHAREDSTATICを交換することにより)共有LibAを作る場合

  • :ここでは今、奇妙なことがあります!

共有ライブラリをすべて自分でAppにリンクする必要があります。私はそれを試み、それは実際に働いた。しかし、ここに私の質問があります:

  • CMakeは自動的にすべてのリンクの依存関係を実行可能ファイルに伝播するはずですか?これは機能のPUBLICキーワードの目的ではありませんか?
  • LibAが共有ライブラリの場合、なぜリンカーエラーが発生しないのですか?

EDIT1:

ことができます場合:私は​​をすれば私が取得:

libA.cpp.o: 
    // ... blah blah ... 
    U mpfit 
    // ... blah blah ... 
+0

'libA'によって' libB'で使われている 'error:undefined reference'のシンボルがありますか? – UmNyobe

+0

@UmNyobeはい、正確には – AstrOne

+0

です。実際に何が呼び出されているかを見るには[詳細な出力](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

答えて

1

それはlibAlibBをリンクする際、リンカが非参照シンボルを落としていることは非常に可能です。つまり、AppにリンクするまでにはのシンボルがlibBになります。

この場合、リンカーオプションを指定して、最初のリンケージ中にlibB全体を保持することができます。例えば、gccの場合--whole-archive ld parameter

関連する問題