CLion:Cmake 配置类型的问题

Posted

技术标签:

【中文标题】CLion:Cmake 配置类型的问题【英文标题】:CLion: issue with Cmake configuration types 【发布时间】:2016-08-21 12:27:22 【问题描述】:

我了解默认情况下,Clion 会在所有四种配置中为 Clion 中加载的项目创建二进制文件:

(Debug;Release;MinSizeRel;RelWithDebInfo)

还有一个叫:__default__

我正在使用第三方 cmake module,它以 add_subdirectory() 可以在其上运行的方式下载外部项目,以便将其包含在根项目中。

add_subdirectory($downloaded_proj_src_dir $downloaded_proj_bin_dir EXCLUDE_FROM_ALL)

在这个设置中,如果我决定将子项目放在根项目的二进制目录之外,我会得到:

错误:不支持 CMake 构建目录之外的二进制目录。这个错误很可能是由带有明确指定 binary_dir 参数的 add_subdirectory 命令引起的。

这是 CMake 可以理解的限制。

现在如果我决定将下载项目的二进制目录设置在父项目二进制目录的子目录中,即:

set(downloaded_proj_bin_dir "$CMAKE_BINARY_DIR/$downloaded_proj-build")
...
add_subdirectory($downloaded_proj_src_dir $downloaded_proj_bin_dir EXCLUDE_FROM_ALL)

我将在所有构建配置的父二进制目录中创建文件,因为$CMAKE_BINARY_DIR 对于每个配置都是不同的。为了避免在项目视图侧边栏中看到所有这些目录,我将CMAKE_CONFIGURATION_TYPES 设置为Debug。但即便如此,我得到:

错误:配置调试 当前的 CMakeCache.txt 目录 /path/Debug/downloaded_proj_bin/CMakeCache.txt 与创建 CMakeCache.txt 的目录 /path/__default__/downloaded_proj_bin/CMakeCache.txt 不同。这可能会导致在错误的位置创建二进制文件。如果不确定,请重新编辑 CMakeCache.txt

很明显,这个__default__ 配置出了点问题,我不明白。那么问题来了,这个default的配置有什么意义,这里为什么会有冲突呢?

附:将配置设置为 __default__ 并不能解决问题,因为我将创建一个 __default__0 配置并得到相同的错误。

更新:一些进一步的观察

    我在 IDE 中设置的环境变量对 cmake 构建没有任何影响。 Cmake "options" 然而,它可能会作为参数传递给 cmake 似乎确实有效。 -D CMAKE_CONFIGURATION_TYPES=调试。 当我指定命令行选项时,我得到 ​​li>

警告:项目未使用手动指定的变量: CMAKE_CONFIGURATION_TYPES

但它显然确实具有不再创建其他构建配置的效果。我的猜测是这条消息与忽略参数的__default__ 构建有关。

    即使在 IDE 中指定 CMAKE_CONFIGURATION_TYPES 的情况下,我仍然会得到额外的 __default__ 构建,它显然不受 CMAKE_CONFIGURATION_TYPES 分配的影响。 日志记录:message("Build type: $CMAKE_BUILD_TYPE ) 不返回任何 build_type。 输出message(and generator: $CMAKE_GENERATOR ") 为两者返回“Unix-make 文件”,因此两者都是使用同一个生成器生成的。 从 CMakeCache.txt 文件中获取差异,我可以看到它们是相同的。

【问题讨论】:

在您的问题中还有一些事情需要您澄清:(1)您要如何/在哪里尝试设置 CMAKE_CONFIGURATION_TYPES? (2) 你/CLion 在运行 CMake 时使用什么 CMake 生成器? (3) 您是否在测试中复制了任何内容(可能不是一个好主意)? (4) 如果你清除你的构建目录并重新开始,你会得到同样的错误吗? @CraigScott 1) 我在 clion 的选项中做到了:postimg.org/image/hx8b4154x 2) 出于某种未知原因,在我实验性地添加后: set(CMAKE_CONFIGURATION_TYPES Debug CACHE TYPE INTERNAL FORCE) 在 project() 之前并刚刚删除它给我的二进制目录:错误:CMake 无法找到与“Unix Makefiles”相对应的构建程序。 CMAKE_MAKE_PROGRAM 未设置。您可能需要选择不同的构建工具。错误:CMAKE_C_COMPILER 未设置,EnableLanguage 之后错误:CMAKE_CXX_COMPILER 未设置,EnableLanguage 之后我试图让它再次工作。 3) 没有 4) 是的。 听起来 CLion 已经缓存了一些您正在以它无法应对的方式进行更改的东西。 CLion 是否有自己的项目文件(除了 CMakeCache.txt 和 CMakeLists.txt)?如果是这样,请尝试删除它并重新创建一个新项目。 另外,如果 CLion 使用“Unix Makefiles”生成器,那么它必须在幕后设置 4-5 个完全独立的构建。 Unix Makefiles 生成器是单一配置的。 CLion 可能会通过为您管理 4-5 种构建类型来模拟多重配置。试图通过强制 CMAKE_CONFIGURATION_TYPES 来愚弄它最终可能不是一条可行的路径。 This link 可能有助于您理解(不是 CLion 特定的)。 @CraigScott 是的,它确实创建了单独的构建。我设法通过从 IDE 设置配置类型来让它只创建调试版本。我刚刚意识到我的问题是我取消了“传递环境变量”选项。这消除了我上面提到的错误,但我仍然收到我在问题中描述的原始错误。我会看看你链接到的样子谢谢。 【参考方案1】:

您在 DownloadProject.c 中进行了正确的设置吗?为:

set(_DownloadProjectDir "$CMAKE_CURRENT_LIST_DIR")

我在尝试设置谷歌测试时遇到了同样的问题(在https://github.com/Crascit/DownloadProject 的帮助下),我的 _DownloadProjectDir 被设置为“测试”。也许当我在我的项目中移动这个 cmake 文件时,Clion 会自动改变它。

【讨论】:

【参考方案2】:

所以,事实证明,您可以通过在 DownloadProject.cmake 的第 145 行上方添加以下行来轻松解决这个问题:

file(REMOVE "$DL_ARGS_DOWNLOAD_DIR/CMakeCache.txt")

这似乎是因为 CLion 将默认设置复制到其他配置并且不清除缓存。这只是一个问题,因为 DownloadProject 在项目中创建了一个项目(我认为......)。无论如何,在配置 CMakeLists.txt 之前删除这个文件可以绕过这个问题。我将向 DownloadProject 存储库提交一个拉取请求,因为这在不使用 CLion 时似乎没有任何不利影响。

【讨论】:

以上是关于CLion:Cmake 配置类型的问题的主要内容,如果未能解决你的问题,请参考以下文章

CLion 中添加 release 配置

Clion中的CMAKE配置OpenCv

clion配置cmake添加boost库

为啥在 CMake 配置和生成完成后使用 CLion 构建 OpenCV 时会出现错误?

Ubuntu qt clion 配置

Clion(CMake工具)中如何引入第三方库