如何在 CMake 中明确指定树外源?

新手上路,请多包涵

我看了这篇文章: Using CMake to statically link to a library outside the project 。但我仍然无法解释这意味着什么:

 add_subdirectory(/path/to/the/library/source/directory subproject/grzeslib)

我假设“/path/to/the/library/source/directory”是指硬盘驱动器的路径,但我不明白“subproject/grzeslib”是什么意思。现在我尝试了:

 include_directories(../path/to/dir)
add_subdirectory (../path/to/dir .)

但我收到了一个详细的警告。有一个更好的方法吗?

原文由 user3063750 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 592
2 个回答

第二个参数是该子目录中目标结果的输出目录。

从这里的文档: https ://cmake.org/cmake/help/v3.3/command/add_subdirectory.html

添加子目录

将子目录添加到构建。

 add_subdirectory(source_dir [binary_dir]
             [EXCLUDE_FROM_ALL])

将子目录添加到构建。

  • source_dir 指定源 CMakeLists.txt 和代码文件所在的目录。如果它是相对路径,它将相对于当前目录进行评估(典型用法),但它也可能是绝对路径。
  • binary_dir 指定放置输出文件的目录。如果它是相对路径,它将相对于当前输出目录进行评估,但它也可能是绝对路径。如果未指定 binary_dir,则在展开任何相对路径之前,将使用 source_dir 的值(典型用法)。
  • 指定源目录中的 CMakeLists.txt 文件将由 CMake 立即处理,然后在当前输入文件中的处理继续超出此命令。
  • 如果提供了 EXCLUDE_FROM_ALL 参数,则子目录中的目标默认不会包含在父目录的 ALL 目标中,并且会从 IDE 项目文件中排除。用户必须在子目录中显式构建目标。这适用于子目录包含项目的单独部分有用但不必要的情况,例如一组示例。通常,子目录应包含其自己的 project() 命令调用,以便在子目录中生成完整的构建系统(例如 VS IDE 解决方案文件)。请注意,目标间依赖关系取代了此排除。如果父项目构建的目标依赖于子目录中的目标,则依赖目标将包含在父项目构建系统中以满足依赖关系。

原文由 FrankM 发布,翻译遵循 CC BY-SA 4.0 许可协议

文档

将子目录添加到构建。 source_dir 指定源 CMakeLists.txt 和代码文件所在的目录。如果它是相对路径,它将相对于当前目录进行评估(典型用法),但它也可能是绝对路径。 binary_dir 指定放置输出文件的目录。如果它是相对路径,它将相对于当前输出目录进行评估,但它也可能是绝对路径。如果未指定 binary_dir,则在展开任何相对路径之前,将使用 source_dir 的值(典型用法)。指定源目录中的 CMakeLists.txt 文件将由 CMake 立即处理,然后在当前输入文件中继续处理超出此命令

从您的示例中,在“/path/to/the/library/source/directory”中创建的所有二进制文件都将放在“subproject/grzeslib”中,保持“干净”源目录是一件好事。

原文由 Joel 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题