2012-03-28 11 views
0

STATIC libを呼び出すEXEを持つ1つの作業プロジェクト(P1)があります。 Windows、MAC、Linux上でコンパイルして正常に実行します。CMakeプロジェクトは、SHAREDライブラリをコンパイルしてもSTATICライブラリではない

今、別のSTATICライブラリを呼び出すSTATICライブラリを呼び出すEXEを持つ2番目のプロジェクト(P2)があります。この場合、WINDOWSとMACでは正常に動作しますが、Linuxでは、リンク時には多くの参照が見つかりません。私はチェックしました:

  1. libsがあることを確認しました。 OK
  2. コンパイラがそれらにアクセスできること。 OK。
  3. P1とP2のCMakeファイルは似ています。 OK。
  4. コンパイラのフラグとコマンドは似ています。 OK。

私は絶望的でした。私は単純にlibsをSTATICからSHAREDに切り替えました。そして今、Linux上でうまくコンパイルされます。基本的には、add_library(lib STATIC ...)add_library(lib SHARED ...)に変更したところ、すべて正常に機能しました。

私はSHAREDでは動作していますが、STATICでは動作していないということを知りません。

ありがとうございました。 よろしくお願いいたします。

答えて

1

スタティックライブラリAが別のスタティックライブラリBに依存する場合、この依存関係はAの作成中に解決されませんが、実行可能ファイルをAにリンクすると、リンカはAで必要なシンボルを解決する必要がありますAのあなたの使用について)。

私はこの今のところ詳細を見つけることができませんが、私はVisual Studio(またはCMakeとの組み合わせ)がそれらのライブラリを自動的に追加することを強く想定しています。 Linuxでは、実行可能ファイルを正常にリンクするために、リンクライブラリにBを明示的に追加する必要があります。

共有ライブラリAを作成すると、BのすべてのシンボルがBの作成中に解決されます(リンカは実際にBから必要なものを探します)。したがって、あなたの例は、共有ライブラリに切り替えるときに機能します。

+0

さて、私はもう一度チェックしますが、両方のライブラリがCMake target_link_librariesに追加されています...私はちょうど探し始める手がかりがありません。あなたの提案をありがとう! – Korchkidu

+0

これは、target_link_libraries(lib2 lib1)とtarget_link_libraries(EXE lib1 lib2)のようなことをしなければならないようです...あなたには意味がありますか? – Korchkidu

+0

はい、それは私の意味です。 lib2に必要なシンボルだけが解決されるので、実行可能ファイルを_both_静的ライブラリとリンクする必要があります(両方とも静的ライブラリであれば、lib1をlib1にリンクすることはできません)。 –

関連する問題