CLion:Cmake配置类型存在问题

CLion:Cmake配置类型存在问题,cmake,clion,Cmake,Clion,我理解,默认情况下,Clion会在所有四种配置中为加载到Clion中的项目创建二进制文件: (Debug;Release;MinSizeRel;RelWithDebInfo) 以及一个名为:\uuuuu default\uuuu 我使用的是第三方cmake,它下载外部项目的方式是可以在其上运行add_subdirectory(),因此它将包含在根项目中 add_subdirectory(${downloaded_proj_src_dir} ${downloaded_proj_bin_dir}

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

(Debug;Release;MinSizeRel;RelWithDebInfo)
以及一个名为:
\uuuuu default\uuuu

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

add_subdirectory(${downloaded_proj_src_dir} ${downloaded_proj_bin_dir} EXCLUDE_FROM_ALL)
在此设置中,如果我决定将子项目放在根项目的二进制目录之外,我会得到:

错误:不支持CMake生成目录之外的二进制目录。此错误很可能是由带有显式指定的二进制\u dir参数的add\u 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\u binary\u DIR}
对于每个配置都是不同的。为了避免看到项目视图侧栏上列出的所有这些目录,我将
CMAKE\u配置类型设置为
Debug
。但即便如此,我还是得到了:

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

显然,这个
\uuuu默认值\uuuu
配置发生了一些我不理解的事情。所以问题是,这个
默认
配置的意义是什么,为什么这里会有冲突

另外,将配置设置为
\uuuu default\uuu
并不能解决问题,因为我将创建一个
\uu default\uu 0
配置,并得到相同的错误

更新:一些进一步的观察结果

  • IDE中设置的环境变量对cmake构建没有任何影响
  • 然而,Cmake“选项”似乎确实有效,这些选项可能会作为参数传递给Cmake。 -D CMAKE_配置_类型=调试
  • 当我指定命令行选项时,我得到
  • 警告:项目未使用手动指定的变量: CMAKE_配置_类型

    但它显然不再创建其他构建配置。我的猜测是,此消息与忽略参数的
    \uuuu default\uuu
    构建相关

  • 即使在IDE中指定CMAKE_配置_类型的情况下,我仍然会得到额外的
    \uuu默认\uu
    构建,这显然不受CMAKE_配置_类型分配的影响
  • 日志记录:
    消息(“生成类型:${CMAKE\u Build\u type})
    不返回任何生成类型
  • 输出
    消息(和生成器:${CMAKE_generator}”)
    会为两者返回“Unix生成文件”,因此这两个文件都是用同一个生成器生成的
  • 从cmakcache.txt文件中取一个diff,我可以看到它们是相同的

  • 您是否在DownloadProject.c中设置了正确的设置?用于:

    set(_DownloadProjectDir“${CMAKE_CURRENT_LIST_DIR}”)


    我在设置google测试时遇到了同样的问题(在的帮助下),我的_DownloadProjectDir被设置为“test”。也许当我在我的项目中移动此cmake文件时,Clion会自动更改此设置。

    您在DownloadProject.cmake中有正确的设置吗?用于:

    set(_DownloadProjectDir“${CMAKE_CURRENT_LIST_DIR}”)


    我在设置google测试时遇到了同样的问题(在的帮助下),我的_DownloadProjectDir被设置为“test”。也许当我在我的项目中移动这个cmake文件时,Clion会自动更改它。

    因此,通过在DownloadProject.cmake的第145行上方添加以下行,您可以非常轻松地对其进行排序:

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

    这似乎是因为CLion将默认值复制到其他配置,而不清除缓存。这是一个问题,因为DownloadProject在项目中创建了一个项目(我认为…)。无论如何,在配置CMakeLists.txt之前删除此文件会忽略此问题。我将向DownloadProject存储库提交一个pull请求,因为这在不使用CLion时似乎不会产生任何负面影响。

    因此,通过在DownloadProject.cmake的第145行上方添加以下行,您可以非常轻松地解决此问题:

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

    这似乎是因为CLion将默认值复制到其他配置,而不清除缓存。这是一个问题,因为DownloadProject在项目中创建了一个项目(我认为…)。无论如何,在配置CMakeLists.txt之前删除此文件会忽略此问题。我将向DownloadProject存储库提交一个pull请求,因为这在不使用CLion时似乎不会产生任何不利影响。

    在您的问题中,还有一些事情需要澄清:(1)您试图如何/在哪里设置CMAKE\U配置\U类型?(2) 运行CMake时,您/CLion使用什么CMake生成器?(3) 您在测试中是否复制了任何内容(可能不是一个好主意)?(4) 如果删除构建目录并重新开始,是否会出现相同的错误?@CraigScott 1)我在clion的选项中这样做了:2)出于未知原因,在我实验性地在项目()之前添加了:set(CMAKE_配置_类型调试缓存类型内力)刚刚删除了它提供给我的二进制目录:错误:CMake无法找到与“Unix Makefiles”对应的构建程序。未设置CMAKE_MAKE_程序。您可能需要选择不同的构建工具。错误:CMAKE_C_编译器未设置,启用后语言错误:CMAKE_CXX_编译器未设置,启用后