「app」と「lib」の兄弟ディレクトリを持つプロジェクトを指定します。「app」は「lib」で構築された静的ライブラリに応じて実行可能ファイルを作成します。私が望むのは、通常のビルドプロセスがライブラリのみをビルドする状況ですが、 "app"をビルドすると "lib"と "app"の両方がビルドされます。add_subdirectoryを使用するのではなく、ビルドされた静的ライブラリとリンクしていますか?
私は現在、今やっていることはapp
で、私はadd_subdirectory
でlib
が含まれていることですが、何らかの理由で、これは私はありませんメカニズムを介してリンクラインにlib
の間接的な依存関係のすべてに引っ張っています知っている。私はのような私のアプリだけでlibmylib.a
とlibmylib.pc
を構築することです、app
ちょうどlibmylib.pc
(または手動で指定)から独自のリンクラインを計算することができますが、私はどのように行われているのか分かりません。
ここで私は今、セットアップ持っ最小作業例です:へ
のlib/CMakeLists.txt
cmake_minimum_required(VERSION 3.8.0)
project(mylib CXX)
find_package(PkgConfig REQUIRED)
pkg_check_modules("mylib" "libssl")
find_package(Boost REQUIRED)
set(LIBDIR "${PROJECT_SOURCE_DIR}")
set(HEADERS "${LIBDIR}/map_printer.hpp")
set(SOURCES "${LIBDIR}/map_printer.cpp")
add_library("mylib" "${SOURCES}")
target_include_directories("mylib" PUBLIC "${LIBDIR}"
"${Boost_INCLUDE_DIR}"
"${mylib_INCLUDE_DIRS}")
target_link_libraries("mylib" "${Boost_LIBRARIES}" "${mylib_LIBRARIES}")
install(TARGETS "mylib" ARCHIVE DESTINATION "lib")
install(FILES ${HEADERS} DESTINATION "include")
アプリ/ CMakeLists.txt
cmake_minimum_required(VERSION 3.8.0)
project(mylib CXX)
set(APPDIR "${PROJECT_SOURCE_DIR}")
set(LIBDIR "${APPDIR}/../lib")
set(SOURCES "${APPDIR}/main.cpp")
add_subdirectory("${LIBDIR}" "build")
list(APPEND LIBS "mylib")
add_executable("myapp" "${SOURCES}")
target_include_directories("myapp" PUBLIC "${LIBDIR}")
target_link_libraries("myapp" "${LIBS}")
install(TARGETS "myapp" DESTINATION "bin")
実際の例を得て、ここにlibのlibssl
を引くソースファイルがあります(しかし、この楽しいctionアプリで使用されていない) - 彼らは唯一の完全性のために含まれているので、私は要旨に入れて、私は質問のテキストを乱雑たくありませんでした:
問題はときに私cmake app
とはmake VERBOSE=1
を行うことで、生成されたリンカ・コマンドは次のとおりです。
/usr/lib/hardening-wrapper/bin/c++ CMakeFiles/myapp.dir/main.cpp.o -o myapp build/libmylib.a -lssl
-lssl
はどこでもapp
に指定されていません。通常これは問題ありませんが、私のリアルアプリでは、-lssl
と他のいくつかの不要なシンボルが間接的な依存関係のために.soファイルとしてインクルードされています。リンカコマンドから手動でそれらを削除すると、タスクは正常に構築され実行されます。理想的には、.a
の.pc
ファイル(この例では生成されていません)を使用していますが、余分な依存関係が必然的に引き込まれている場合、手動でリンク線を微調整できますが、この方法では、他のもの)がlib
スコープから漏れていると私は理解できません。
['target_link_libraries'](https://cmake.org/cmake/help/latest/command/target_link_libraries.html)のドキュメントをご覧ください。ターゲットの依存関係を伝播させたくない場合は、 'PRIVATE'またはデフォルトで使用する' PUBLIC'以外のものを指定する必要があります。 – legalize
@legalize Aaaaah!それは非常に物事を明確にする、ありがとう!あなたがその答えをしたいのなら、それはどんな答えとしても良いようです。 – Paul