web-dev-qa-db-ja.com

CMake:サブプロジェクトのすべての静的ライブラリから単一の共有ライブラリを作成するにはどうすればよいですか?

次のレイアウトがあります。

_top_project
    + subproject1
    + subproject2
_

_subproject1_および_subproject2_はそれぞれ静的ライブラリを作成します。これらの静的ライブラリを_top_project_レベルで単一の共有ライブラリにリンクしたいと思います。

これまでに収集した情報は次のとおりです。

  • 静的ライブラリを単一の共有ライブラリにリンクできるようにする位置独立コードを作成するために_-fPic_(Windows以外のすべてで必要)を使用してコンパイルするか、すべての静的ライブラリを解凍します(例:ar)そしてそれらを共有ライブラリに再リンクします(これはエレガントで移植性のないソリューションだと思います)
  • すべてのソースファイルは_add_library_コマンドに明示的に指定する必要があります。何らかの理由で理解できないため、単にadd_library(${PROJECT_NAME} SHARED subproject1 subproject2)と書いても期待どおりに機能しません(基本的に空のライブラリが作成され、依存関係)
  • CMakeにはOBJECTライブラリー機能がありますが、目的は本当に自分がやりたいことを行うことではないと思います。

何かご意見は?

50
Deimos

それを行う別の方法は、すべてのプロジェクトのソースファイルとヘッダーファイルのパスを提供し、それらを一緒にビルドして.soを生成することです。これは通常、静的ライブラリを作成してからそれらから共有ライブラリを作成する代わりに、推奨される方法です。

基本的に、次のことを行う必要があります。

FILE(GLOB subproject1_sources
  <sub_project1_lib_sources_dir>/file1.c
  <sub_project1_lib_sources_dir>/file2.c //... etc
)

FILE(GLOB subproject2_sources
  <sub_project2_lib_sources_dir>/file1.c
  <sub_project2_lib_sources_dir>/file2.c //... etc
)

FILE(GLOB topProject_sources
  <top_project_lib_sources_dir>/file1.c
  <top_project_lib_sources_dir>/file2.c //... etc
)

include_directories("<sub_project1_lib_sources_dir>")
include_directories("<sub_project2_lib_sources_dir>")
include_directories("<top_project_lib_sources_dir>") //should be "." if you're building from here

add_library(topProject SHARED ${topProject_sources} ${subproject1_sources} ${subproject2_sources})
0
sasfour