前言:我是only谈论本地编译,not关于安装项目。这是因为我还没有对适当的研究进行足够的研究install
使用 CMake,但如果我的问题直接涉及到,请插话install
实践(似乎有可能)。
TL;DR
你在什么场景下not想要将所有正在构建的项目库收集到同一目录中吗?为什么从来没有人CACHE
the CMAKE_*_OUTPUT_DIRECTORY
paths?
是否有必要执行$<CONFIG>
直接等级规格?
一般默认值应该是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.")
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 的多功能性感到兴奋,我并不是说他们应该在这里做任何默认设置——这将由项目决定。我试图了解最合适的默认选择是什么,这也允许开发人员绕过我的默认选择(如果他们选择的话)。