【问题标题】:How to build only one target for dependency?如何只构建一个依赖目标?
【发布时间】:2019-01-03 19:10:51
【问题描述】:

我想在 Windows 下使用 CMake + Visual Studio 构建一个具有很多依赖项的应用程序,例如zlib。它们都是静态库。

我已经尝试过ADD_SUBDIRECTORY,它工作得很好,但不是只构建依赖目标(zlibstatic),而是构建所有目标。

如何删除未使用的目标(及其解决方案)或只选择一个? 主要是我在寻找功能来定义只需要的目标。

我的CMakeLists.txt的一部分:

ADD_SUBDIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}/deps/zlib")
TARGET_INCLUDE_DIRECTORIES(MyProject PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/deps/zlib")
TARGET_LINK_LIBRARIES(MyProject zlibstatic)

【问题讨论】:

  • @Fred,这有点帮助。现在它没有构建我不想要的目标,但他们的解决方案仍然放在 MyProject 附近。这也不是优雅的解决方案,因为您需要编写您不想构建的每个目标。主要是我在寻找功能来定义只需要的目标,而不是禁用不需要的目标。
  • 根据zlib mirror,只有 2 个目标 - 共享库和静态库。如果您愿意编辑 zlib 的 CMakeLists.txt,您可以删除您不感兴趣的部分。
  • @SteveLorimer 我仍然想让所有依赖项保持最新。因此,每次更新时为每个依赖项更改每个 CMakeLists.txt 是非常不舒服的。
  • @kerrytazi 每个人都有自己的 - 在#work 我们有我们自己的CMakeLists.txt 文件,用于我们拉入的每个第 3 方依赖项(总共约 40 个)。我们这样做主要是因为我们想要控制依赖项的编译器选项。根据我的经验,维护一点也不不舒服。当然是 YMMV

标签: c++ visual-studio cmake


【解决方案1】:

我终于想通了。

MyProject
├───build  <- here I call cmake
├───deps
│   └───zlib
│       └───CMakeLists.txt
├───inc
├───src
└───CMakeLists.txt
# Include project but remove all tartgets
ADD_SUBDIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/deps/zlib EXCLUDE_FROM_ALL)

# Use only specific one target
ADD_DEPENDENCIES(MyProject zlibstatic)

# Include dirs from zlib source directory and from output directory becuse it generates some headers
TARGET_INCLUDE_DIRECTORIES(MyProject PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/deps/zlib
    ${CMAKE_CURRENT_BINARY_DIR}/deps/zlib
)

# Just to create beautiful structure in project tree
SET_PROPERTY(TARGET zlibstatic PROPERTY FOLDER Deps)

# Link after all
TARGET_LINK_LIBRARIES(MyProject zlibstatic)

【讨论】:

    【解决方案2】:

    我建议您改用 vcpkg 或 conan 来解决您的依赖库问题,这更简洁,并且除了仅标头库之外运行良好。

    您当然可以手动执行此操作,但您会丢失漂亮的 cmake 设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 2020-05-25
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 2013-01-30
      相关资源
      最近更新 更多