使用具有外部依赖关系的库构建多个子项目

Kab代码

我正在一个包含CMake(版本3.11)和子目录的项目中挣扎。它包括ITK作为外部库。

我想创建可在不同子目录(如MyApp)中使用的库,以构建基于MyLib的多个应用程序,而MyLib中的每个更改都会在其他应用程序中更新。MyLib是仅标头的模板库。另外,这种库在VisualStudio中没有自己的项目。

我的问题是:

  1. 在这种情况下使用CMake的正确方法是什么?我已经搜索并尝试了一些示例,但未成功。理想情况下,我可以独立于MyLib构建应用程序。顶部的CMakeLists.txt可能不会从库中提取包含内容。这应该由应用程序完成。
  2. 如果MyLib成为非标头库,将会发生什么变化?将来我可能会添加非模板化类。

奖励问题:

  1. 如何将仅标头的库添加到VisualStudio?这更是一个方便的问题。

感谢您的帮助,如有必要,我可以提供更多详细信息。

源环境如下所示:

ProjectDirectory
-  CMakeLists.txt
-- MyLib
   - CMakeLists.txt
   -- include
      - File1.h (template header)
      - File1.hxx (template body)
   -- src
      - (empty for now)
-- MyApp
   - CMakeLists.txt
   - AppFile1.cxx (File containing main function)

这是一个资源外生成项目。理想情况下,将已编译的库和应用程序放在这样的目录中(在Windows上):

└── bin
    ├── Debug
    │   ├── MyApp.exe
    │   └── MyLib.lib
    └── Release
        ├── MyApp.exe
        └── MyLib.lib

ProjectDirectory CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(project_name)

# Setup build locations.
if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
endif()
if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
endif()
if(NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
endif()

add_subdirectory(MyLib)
add_subdirectory(MyApp)

MyLib CMakeLists.txt:

find_package(ITK REQUIRED
    COMPONENTS RTK ITKImageIO)
include(${ITK_USE_FILE})

set(HDRS
    ${CMAKE_CURRENT_SOURCE_DIR}/include/File1.h
    ${CMAKE_CURRENT_SOURCE_DIR}/include/File1.hxx
)

add_library(MyLib ${HDRS})

target_include_directories(MyLib
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:include>
    PRIVATE
        src)

target_link_libraries(MyLib
    PUBLIC ${ITK_LIBRARIES})

export(TARGETS MyLib FILE MyLibConfig.cmake)

MyApp CMakeLists.txt

find_package(ITK REQUIRED
    COMPONENTS RTK ITKRegistrationMethodsv4 ITKTransformIO ITKImageIO)
include(${ITK_USE_FILE})

set(SRCS
    AppFile1.cxx)

add_executable(MyApp ${SRCS})
include_directories(${CMAKE_SOURCE_DIR}/MyLib/include)
target_link_libraries(MyApp
    ${ITK_LIBRARIES}
    MyLib)

编辑1:从MyLib和MyApp CMakeLists.txt中删除项目(X),并将目标更改为MyLib。

马修·布鲁彻(Matthieu Brucher)

您可以有一个空项目,只需创建一个自定义目标即可:

add_custom_target(MyLib SOURCES ${CMAKE_MYLIB_SRC} ${CMAKE_MYLIB_HDR})

由于您的代码仅是标头,因此任何依赖目标都将看到文​​件中的更改并重新编译。此之上无事可做您不必创建目标,尽管第三个问题就是答案。

但是,如果ITK只是您的依赖项,那么既然您有了目标,就可以PUBLIC在其上添加属性,例如依赖项库,由于您的库而需要对其进行链接。

在这种情况下,需要为其添加代码:

target_link_library(${NEWTARGET} PRIVATE MyLib) # PUBLIC/PRIVATE has to be tailored

这就是问题1的答案。

如果您的库仅变为非标题,则只需更改add_custom_target调用即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在具有多个子项目的SBT项目中覆盖子项目中的设置

如何为具有所有子项目的项目设置依赖关系?

将公共库与多个子项目链接

Gradle子项目构建依赖项

如何使用 Jenkins 构建到存储库子项目

IntelliJ IDEA具有多个gradle子项目

如何使SBT子项目具有多个Scala版本?

创建具有依赖项的多个子项的服务

在Intellij中有多个子项目的开放项目

在多个子项目之间共享预处理宏定义,即共享库

多个子项目,取决于同一个库

如何使用多个子项目设置Eclipse项目(OSGi-Bundles)

如何在多项目构建中排除其他子项目的传递依赖关系?

如何排除其他子项目带来的依赖关系?

未解决对子项目中包的依赖关系

使用具有不同版本Android依赖关系的同一库的两个或多个库之间发生冲突

如何在子项目中具有相同的依存关系而不重复自己?

将gradle子项目与另一个子项目作为依赖项进行编译

如何使用具有依赖关系的Github页面?

将具有外部依赖关系的Java库添加到Android项目

陷入具有外部jar依赖关系的构建jar中

Gradle对所有子项目的依赖

列出所有子项目的 gradle 依赖项

具有多个子项的基准继承

解析具有多个子项的 xml

对多模块构建中的所有子项目使用withJavadocJar()和withSourcesJar()

是否每个子项目都可以使用带有version.sbt的多项目SBT

Git:由多个子项目组成的单个项目的最佳方法?

具有左右对齐文本的离子项目