【问题标题】:Can I cause a CMake internal error?我会导致 CMake 内部错误吗?
【发布时间】:2016-03-02 12:08:15
【问题描述】:

在我的问题What can cause a CMake option not work? 之后,我试图找出使用 clean-all.cmake 和手动删除构建目录之间是否有任何区别。运行 clean-all 后,我仍然遇到选项问题。当我删除构建子目录时,我收到以下错误消息:

-- Looking for include file pthread.h
-- Looking for include file pthread.h - not found
CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
CMake Error: Internal CMake error, TryCompile configure of cmake failed
CMake Error at /usr/local/share/cmake-3.2/Modules/FindPackageHandleStandardArgs.cmake:138 (message):
  Could NOT find Threads (missing: Threads_FOUND)
Call Stack (most recent call first):
  /usr/local/share/cmake-3.2/Modules/FindPackageHandleStandardArgs.cmake:374 (_FPHSA_FAILURE_MESSAGE)
  /usr/local/share/cmake-3.2/Modules/FindThreads.cmake:204 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  cmake/Dependencies.cmake:11 (find_package)
  CMakeLists.txt:53 (include)

并且日志文件只包含:

Determining if files pthread.h exist failed with the following output:

Source:
/* */
#include <pthread.h>


int main(void){return 0;}

而且,从那以后,系统一直在报告该错误。所以,看起来有区别:);它是什么?我的 CMakeLists.txt 是否有可能导致一些内部错误?

PS:在出现这个永久错误后,我开始寻找它的原因,再次构建我的 CMakeLists.txt,从删除的构建子目录开始。

一开始我有

option (CLEAN_ALL "Make a cleanup before building"  OFF)

稍后

if(CLEAN_ALL)
include(cmake/clean-all.cmake)
endif(CLEAN_ALL)

cmake 文件是

# clean-all.cmake
# Cleans all subdirectories in the build subdirectory
set(cmake_generated ${CMAKE_BINARY_DIR}/CMakeCache.txt
                    ${CMAKE_BINARY_DIR}/cmake_install.cmake  
                    ${CMAKE_BINARY_DIR}/Makefile
                    ${CMAKE_BINARY_DIR}/CMakeFiles
# Above this, the common directories, below the project-specific ones                    
                    ${CMAKE_BINARY_DIR}/bin
                    ${CMAKE_BINARY_DIR}/lib
                    ${CMAKE_BINARY_DIR}/QtGUI
                    ${CMAKE_BINARY_DIR}/test
)

foreach(file ${cmake_generated})

  if (EXISTS ${file})
     file(REMOVE_RECURSE ${file})
  endif()

endforeach(file)

看起来错误是可重现的:删除构建并打开选项,我收到提到的错误。同时,使用选项OFF,它构建OK。使用那种 clean-all 有什么害处吗?

【问题讨论】:

  • The answer 这是您的clean-all.cmake 脚本的来源明确表示,调用此脚本后的任何 CMake 操作都将不起作用。那么,你想要什么?
  • 我认为“不起作用”和“导致内部错误”是不同的。 And also, in a second run, when the option is OFF, shall CMake remember that it was ON, until I manually delete build?
  • 选项值与其他缓存变量一样,存储在文件CMakeCache.txt 中。如果删除此文件,所有存储的选项值都会丢失。

标签: cmake internal


【解决方案1】:

CMake 将构建的项目状态作为文件存储在项目的构建目录中。这些文件不受保护,因此对它们进行不当修改(如删除)可能会导致项目状态不一致。

消息Internal CMake error 表示这是(可能)CMake 中的错误 如果项目构建文件由 CMake 生成,外部没有损坏强>。

否则,这样的错误只是表明项目构建以某种方式被破坏了。

在给定的情况下,不一致的状态是由在 CMake 调用期间删除文件 CMakeCache.txt 引起的。 The answer 是您的 clean- all.cmake 脚本的来源明确表示调用此脚本后,CMake 命令将不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2015-06-29
    • 2011-07-21
    • 2011-09-17
    • 2018-08-23
    相关资源
    最近更新 更多