CMake:处理依赖项的正确方法,这些依赖项需要自己生成(跨平台)

vfh0ocws  于 2022-12-13  发布在  其他
关注(0)|答案(2)|浏览(216)

用不提供预构建二进制文件的依赖项构建项目的正确方法是什么(或者如果您想自己构建依赖项)
通常我的项目结构如下

/root/
 - Dependencies/
 - ...Subdirs...
 - Output/
 - CMakeLists.txt

如果一个库已经构建,通常你可以简单地使用find_package将其作为依赖项。
但是,如果没有为每个依赖项执行cmake,它们将没有<PackageName>Config.cmake,因此不能使用find_package找到。
因此,问题是,如果您希望/必须在多个平台上从源代码构建依赖项,您如何组织项目。

  • 使用建立所有依赖关系的脚本
  • 创建一个执行类似操作的cmake目标
  • 其他的

如果一个依赖项还有另一个依赖项也需要构建,该怎么办?
对于.ignore文件,最好将/cmake的所有依赖项都构建到Output/目录中

63lcw9qa

63lcw9qa1#

通常库的CMakeLists.txt被配置为引入一个 library 目标。这意味着你可以把它添加到你自己的项目中,并以 * 几乎 * 与使用find_package依赖项相同的方式使用它。假设项目目录如下所示:

.
|-- CMakeLists.txt
|-- build
|-- src
|-- libs
|   |-- lib1Folder
|   `-- lib2Folder

如果lib1lib2在其相应的文件夹(lib1Folderlib2Folder)中具有CMakeLists.txt配置,则可以将它们添加到您自己的CMakeLists.txt中,如下所示:

add_subdirectory(libs/lib1Folder)
list(APPEND LIB_TARGETS lib1)
list(APPEND LIB_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/libs/lib1Folder/include")

add_subdirectory(libs/lib2Folder)
list(APPEND LIB_TARGETS lib2)
list(APPEND LIB_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/libs/lib2Folder/include")

target_include_directories(MyExecutable SYSTEM PRIVATE ${LIB_INCLUDE_DIRS})
target_link_libraries(MyExecutable PRIVATE ${LIB_TARGETS})

其中MyExecutable是你想链接依赖项的目标的名称。当然不同的库可能有不同的配置(一些库使包含文件夹本身可变,其他库可能不这样做,也没有显式给定include文件夹),但这对我个人来说大多数时候都是有效的。

xghobddn

xghobddn2#

如果项目是cmake项目,则可以将其添加为子目录,并使用以下命令将其添加到生成中:

add_subdirectory(<src-dir> <build-dir>)

之后,您可以将生成目标作为依赖项添加到您的项目中,以便cmake在它们不存在的情况下生成它们。For example if you want to use cpputest in your project, you add it to Dependencies/cpputest“',并将其添加到cmake中

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Dependencies/cpputest ${CMAKE_CURRENT_BINARY_DIR}/cpputest)

cpputest的所有目标都将构建在您的构建目录的子目录中。

target_link_libraries(my_binary CppUTest)`

如果构建my_binary,则会自动构建cpputest。
你可以看一下一个项目,我在那里用了这个:https://github.com/sweintritt/cora
依赖项作为子模块添加到子目录third_party中,并添加到cmake/dependencies.cmake中的构建中。

相关问题