Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将CMake选项从命令行移动到顶级CMakeLists.txt_Cmake_Dcmtk - Fatal编程技术网

将CMake选项从命令行移动到顶级CMakeLists.txt

将CMake选项从命令行移动到顶级CMakeLists.txt,cmake,dcmtk,Cmake,Dcmtk,我使用以下命令,使用命令行构建DCMTK: cmake -DBUILD_APPS=BOOL:OFF ../latest_dcmtk 我想将BUILD_APPS设置从命令行移到顶级CMakeLists.txt配置文件中。无论我如何尝试在顶级配置文件中设置BUILD_APPS选项,除非我从命令行显式设置BUILD_APPS选项,否则我永远不会获得正确的行为 有没有办法从顶级CMakeLists.txt文件显式设置命令行选项 我从DCMTK的资料中借用了这一点&它不起作用: SET (BUILD_A

我使用以下命令,使用命令行构建DCMTK:

cmake -DBUILD_APPS=BOOL:OFF ../latest_dcmtk
我想将BUILD_APPS设置从命令行移到顶级CMakeLists.txt配置文件中。无论我如何尝试在顶级配置文件中设置BUILD_APPS选项,除非我从命令行显式设置BUILD_APPS选项,否则我永远不会获得正确的行为

有没有办法从顶级CMakeLists.txt文件显式设置命令行选项

我从DCMTK的资料中借用了这一点&它不起作用:

SET (BUILD_APPS OFF CACHE BOOL "" FORCE)                                                             
MESSAGE ("-- BUILD_APPS is set to " ${BUILD_APPS})
当我查看由上面的SET命令生成的CMakeCache.txt文件时,我正确地看到了选项SET:

./CMakeCache.txt:BUILD_APPS:BOOL=OFF

不幸的是,该选项不起作用。

一般来说,在使用CMake时,您必须记住两件事:

  • CMake是一种脚本语言,因此所有代码都是按顺序处理的
  • CMake的变量缓存用于在两次运行之间持久化值
  • 因此,我同意@Tsyvarev和@usr1234567的观点,这很可能是一个订购问题:

    • 您必须先执行
      设置(BUILD\u APPS OFF CACHE BOOL”“FORCE)
      ,然后代码才会检查
      if(BUILD\u APPS)
    • 您必须检查主
      CMakeLists.txt
      中是否没有正常变量
      集(BUILD_APPS…
      ),以隐藏缓存的变量
    • CMakeCache.txt
      文件中的任何内容都只是代码处理完成后(在主
      CMakeLists.txt
      末尾)这些变量的状态
    我再试了一次,
    -D
    确实强制缓存条目。因此,使用
    -D
    命令行选项和
    设置(…缓存…强制)
    之间应该没有区别。只是不能将它们组合使用(后者将始终覆盖任何给定的命令行选项)

    请尝试在主
    CMakeLists.txt
    顶部添加,以查找隐藏/覆盖变量的代码部分

    参考资料


    请提供一个示例,因为DCMTK是一个规模相当大的开源项目,所以我无法将代码简化为一个最小的示例。充其量,我可以提供顶级的CMake配置文件。即使我给了你这个文件,你也需要一个Mac来构建等效的项目。这个例子只需要包含一个精简的CMakeLists.txt文件,其中包含一个选项,该选项不工作。选项设置为命令
    选项(build\u APPS“OFF”)
    设置(build\u APPS OFF CACHE BOOL”)
    (不需要强制)对于带有
    cmake
    命令行选项
    -DBUILD\u APPS=BOOL:OFF
    的选项集,该值等效。如果第二种方法有效,但第一种方法无效,则
    CMakeLists.txt
    会执行一些非常特殊的操作。为了确保这一点,我重试了一次,
    -D
    会强制执行缓存项。因此,使用
    -D
    命令行选项和
    设置(…强制)
    之间应该没有区别。我同意有些奇怪,建议在主
    CMakeLists.txt
    顶部添加
    variable\u watch(BUILD\u APPS)
    ,以查找隐藏/覆盖变量的代码部分。有关更多详细信息,请参见例如。