2016-03-02 48 views
0

以下我的问题What can cause a CMake option not work?我试图找出使用clean-all.cmake和手动删除build目录是否有区别。运行clean-all后,我仍然遇到选项问题。当我删除了build子目录,我收到以下错误信息:我可以导致CMake内部错误吗?

-- 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) 

它看起来像错误是重复性:删除构建和切换选项打开,我收到提到的错误。与此同时,选项关闭,它生成OK。使用那个干净的东西有什么不好吗?

+0

[the answer](http://stackoverflow.com/a/13714219/3440745)这是你的'clean-all.cmake'脚本的起源**明确地说**,调用这个脚本之后的任何CMake动作不管用。所以你想要什么? – Tsyvarev

+0

我认为“不起作用”和“导致内部错误”,是不同的。另外,在第二次运行中,当选项关闭时,CMake是否应该记住它已打开,直到我手动删除构建? – katang

+0

与其他缓存变量一样,选项的值存储在文件'CMakeCache.txt'中。如果删除此文件,则所有存储的选项值都将丢失。 – Tsyvarev

回答

0

CMake将作为文件构建的项目状态存储在项目的构建目录中。这些文件是不受保护,所以不适当的修改(如删除)可能会导致项目状态变得不一致。

消息Internal CMake error手段,这是(可能)内的CMake错误,如果项目生成文件,由CMake的生成,未损坏外

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

在给定的情况下,不一致的状态是由CMake调用期间删除文件CMakeCache.txt造成的。 The answer这是你的clean- all.cmake脚本的起源明确地说,在调用这个脚本之后,没有CMake命令会工作。