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命令失败时,是否有方法获取错误?_Cmake - Fatal编程技术网

当CMake命令失败时,是否有方法获取错误?

当CMake命令失败时,是否有方法获取错误?,cmake,Cmake,我正在编写一个脚本,开始使用install命令(用于复制文件),但它不起作用。CMake configure/generate没有显示任何错误(即,它没有停止,也没有显示与此命令相关的警告/错误),并且该命令似乎不起作用,因为我没有看到任何正在复制的文件 由于我是新来的,我想知道: 如何判断安装失败(可能源目录错误,或者目标目录错误)?它似乎在默默地失败 是否有错误代码我可以检查,看看哪里出了问题 何时调用install?当我单击“配置”时?或者项目何时建成 我在Windows上。当您在CM

我正在编写一个脚本,开始使用
install
命令(用于复制文件),但它不起作用。CMake configure/generate没有显示任何错误(即,它没有停止,也没有显示与此命令相关的警告/错误),并且该命令似乎不起作用,因为我没有看到任何正在复制的文件

由于我是新来的,我想知道:

  • 如何判断
    安装失败(可能源目录错误,或者目标目录错误)?它似乎在默默地失败
  • 是否有错误代码我可以检查,看看哪里出了问题
  • 何时调用
    install
    ?当我单击“配置”时?或者项目何时建成

我在Windows上。

当您在CMakeLists.txt中添加一个
install
命令时,会创建一个名为“install”的新目标

为了实际安装所选文件/目标,您需要构建此安装目标。它不是作为“全部”目标的一部分自动构建的

例如,如果您使用的是Visual Studio,“安装”目标应该出现在解决方案资源管理器的“CMakePredefinedTargets”文件夹中。仅选择此目标并构建它将导致生成解决方案并安装所选项目


如果构建或安装过程的任何部分失败,那么通知应该是显而易见的。

对于一般问题,有很多方法可以从CMake获得更详细的输出-我刚刚了解了第三种严重错误:

  • 要调试CMake配方,我喜欢使用message命令,您甚至可以迭代目录并发出消息*
    • e、 g.
      消息(状态“SQLITE3_LIB:${SQLITE3_LIB}SQLITE3_PATH:${SQLITE3_PATH}”)#打印SQLITE3_LIB和SQLITE3_PATH变量
  • 执行详细的构建以解决构建本身的问题
    • 运行
      make VERBOSE=1
      (使用make、
      ninja-v
      with ninja等)以帮助您解决流程故障,例如
      cmake-DYOUR\u OPTION=“insert values”~/path/to/files/&&make VERBOSE=1
  • 如果您发现了无法理解的错误,我刚刚了解到,我们可以对失败的命令运行strace-这可能会有点难以克服,但在您已经精疲力竭的情况下会有所帮助#1和#2
    • 我只是使用
      strace/usr/bin/cmake-E copy\u directory$MY\u SOURCE\u PATH$MY\u DEST\u PATH
      试图理解复制失败的原因
  • *我曾经用一个不同的问题来打印INCLUDE_DIRS:

    get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
    foreach(dir ${dirs})
      message(STATUS "dir='${dir}'")
    endforeach()
    

    这很有道理。要么我看得不够仔细,要么文档在描述这些细节方面做得不好。可能会有帮助吗?