CMAKE_*_OUTPUT_DIRECTORY 的正确使用

2024-04-03

前言:我是only谈论本地编译,not关于安装项目。这是因为我还没有对适当的研究进行足够的研究install使用 CMake,但如果我的问题直接涉及到,请插话install实践(似乎有可能)。

TL;DR

  1. 你在什么场景下not想要将所有正在构建的项目库收集到同一目录中吗?为什么从来没有人CACHE the CMAKE_*_OUTPUT_DIRECTORY paths?

  2. 是否有必要执行$<CONFIG>直接等级规格?

  3. 一般默认值应该是CMAKE_BINARY_DIR, CMAKE_CURRENT_BINARY_DIR, or PROJECT_BINARY_DIR?

1. 缓存还是不缓存?

From 这个优秀的答案 https://stackoverflow.com/a/6595001/3814202

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

您在网络上的许多项目中都可以看到这一点。

  • 家长CMakeLists.txt cannot覆盖这些。
  • 如果父项目想要/需要更改这些,例如将所有内容放在同一个文件夹中,这是不可能的。

所以建议的修改是always CACHE PATH "description":

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib CACHE PATH "Where to place compiled static libraries.")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib CACHE PATH "Where to place compiled shared libraries.")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin CACHE PATH "Where to place compiled executables.")
  • 有什么理由吗not缓存?

2. 治疗$<CONFIG> builds

这个应该差不多always留给发电机,是吗?我的理解(和经验)是通过设置非配置生成器(Visual Studio,XCode,...),使用每个配置构建的文件夹仍然满足于将东西放置在通常的位置。又称为不设置配置级别CMAKE_*_OUTPUT_DIRECTORY_*我将控制权传递给生成器让它决定。

3. BINARY_DIR, CURRENT_BINARY_DIR, or PROJECT_BINARY_DIR?

另一方面,假设开发人员确实not希望他们正在构建的其他项目最终位于同一目录中。如果不是我使用的进一步情况CMAKE_CURRENT_BINARY_DIR OR PROJECT_BINARY_DIR?如果只是一个原始的CMAKE_BINARY_DIR被使用,没有CACHE,那么我绝对没有办法prevent我正在构建的一个子项目最终位于我的旁边。

通过使用CMAKE_CURRENT_BINARY_DIR or PROJECT_BINARY_DIR,如果用户这样做not希望这个库最终位于父项目旁边,他们可以简单地设置CMAKE_*_OUTPUT_DIRECTORY变量after配置这个。

Summary

基本上,对于如何使用这些变量似乎没有任何标准。我对 CMake 的多功能性感到兴奋,我并不是说他们应该在这里做任何默认设置——这将由项目决定。我试图了解最合适的默认选择是什么,这也允许开发人员绕过我的默认选择(如果他们选择的话)。


我和@Tsyvarev 在一起。我没有看到启用 CMake 的项目的用户想要更改构建工件的输出路径,而只想更改安装路径。

1. 缓存还是不缓存?

只是不要设置CMAKE_*_OUTPUT_DIRECTORY变量缓存,因为如果另一个 CMake 项目使用您的项目作为子项目,您在某些情况下会覆盖父项目的设置(缓存变量是全局的)。

2. 治疗$<CONFIG> builds

是的。仅当生成器的默认值不适合时才会给出(“配置名称”=“子文件夹名称”)。

3. CMAKE_BINARY_DIR, CMAKE_CURRENT_BINARY_DIR, or PROJECT_BINARY_DIR?

所以我想说保存变体是首先检查if ()声明如果其他人已经设置了变量并且还可以使用PROJECT_BINARY_DIR https://cmake.org/cmake/help/latest/variable/PROJECT_BINARY_DIR.html:

if (NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
endif()

然后,您的项目的用户仍然可以从外部设置变量,或者父项目可以设置它,并且如果未设置,您将拥有默认值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMAKE_*_OUTPUT_DIRECTORY 的正确使用 的相关文章

随机推荐