2016-03-23 29 views
1

をエクスポートせずに、静的な内部ライブラリにリンク:cmakeの:私はこのような構造を持つプロジェクト持ってそれを

/path/to/my/project 
├── CMakeLists.txt 
├── internal-libs 
│ ├── internal-lib1 
├── libs 
│ ├── lib1 
│ ├── lib2 

lib1は、静的ライブラリです。

lib2は静的ライブラリです。

internal-lib1は静的ライブラリです。

lib2は、lib2とinternal-lib1に静的にリンクします。 lib1lib2がエクスポートされますが、internal-lib1が残されます。リンケージのために、私が持っている:

target_link_libraries(lib2 PRIVATE internal-lib1) 
target_link_libraries(lib2 PRIVATE lib1) 

私の理解では、私は静的および個人リンクしていますので、内部LIB1に関するすべての情報はLIB2に含まれることを、私は内部LIB1をエクスポートする必要がないということです外の世界に。

はしかし、私はクライアントプログラムでそれを使用しようとすると、私はエラーを取得する:私の生成エクスポート設定ファイルの

/usr/bin/ld cannot find -llib-internal1 
collect2: error: ld returned 1 exit status 

、私が持っている:

# Create imported target lib2 
add_library(lib2 STATIC IMPORTED) 
set_target_properties(lib2 PROPERTIES 
INTERFACE_LINK_LIBRARIES "$<LINK_ONLY:lib1>;**$<LINK_ONLY:internal-lib1>**" 
) 
# Create imported target lib1 
add_library(lib1 STATIC IMPORTED) 

を私が誤解アム静的リンクか、セットアップに何か問題がありますか?私はcmake 3.2.2を使用しています。すべての私のターゲットはプライベートです。私はなぜINTERFACE_LINK_LIBRARIESにエントリがあり、LINK_ONLYが何を意味するのか分かりません。

p.s.実際にはlib1とlib2は共用ライブラリであると考えられていますが、静的なバージョンは動作しません。ここでは簡単にするために、エクスポート可能なライブラリの静的なケースについて説明します。

答えて

3

CMakeのコマンド

target_link_libraries(lib2 PRIVATE lib1) 

ライブラリlib1がリンク時にライブラリlib2にコピーされていることを意味するものではありません。 PRIVATEキーワードは、別のライブラリがlib2にリンクしている場合、lib1というライブラリのtransitive usage requirementsにのみ影響します。 cmakeのは、リンク時にlib2lib1をマージlibtoolを使用してPOST_BUILD行動していると

:その場合は

add_custom_command(TARGET lib2 POST_BUILD 
    COMMAND /usr/bin/libtool -static -o $<TARGET_FILE:lib2> 
    $<TARGET_FILE:lib2> $<TARGET_FILE:lib1> 

target_link_librarieslib2lib1をリンクする必要はありません。

+0

私は感謝を見る。私は基本的に、静的ライブラリの単純なケースでは、彼のメソッドが不必要に複雑だと思ったので、ここで試行されているものを実行しようとしていました(http://stackoverflow.com/a/11448878/4376555)。しかし、私はあなたのソリューションはさらにハッキーだと思う。 – ShS

関連する問題