CMake出错,应该怎么办?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMake出错,应该怎么办?相关的知识,希望对你有一定的参考价值。

我想在VS2005上配置OpenCV2.0,我按照下面这个网页做的
http://blog.163.com/wangxh_jy/blog/static/28233883201001594737924/

我的OpenCV安装在C:/OpenCV2.0目录下,CMake下载的2.8版本,安装在G:/Program Files/CMake2.8。

在CMake时,选择的Source Code路径是C:/OpenCV2.0,
Where to build the binaries 选择的路径是C:/CMakeProject,这里的CMakeProject是我自己在C盘上创建的一个空文件夹。

在Configure时候报错,弹出对话框上写的“Error in configuration process, project files may be invalid”。
刚才发不了那么长,只好补充了。。。

下面的窗口内容是:
Check for working C compiler using: Visual Studio 8 2005
Check for working C compiler using: Visual Studio 8 2005 -- broken
CMake Error at G:/Program Files/CMake 2.8/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake:52 (MESSAGE):
The C compiler "cl" is not able to compile a simple test program.

It fails with the following output:

Change Dir: C:/CMakeProject/CMakeFiles/CMakeTmp

Run Build Command:G:\PROGRA~1\VISUAL~1\Common7\IDE\devenv.com
CMAKE_TRY_COMPILE.sln /build Debug /project cmTryCompileExec

。。。。。。(中间太长了就不粘了)

CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
CMakeLists.txt:35 (project)

Configuring incomplete, errors occurred!

在这次之前我也CMake过一次,成功了,但是后来卸载了CMake软件,而且CMake生成的东西也删除了,现在又要用,但是总是这个地方报错,非常头痛。。。
请问我该怎么做啊?

参考技术A 根据提示Check for working C compiler using: Visual Studio 9 2008 -- broken知道,问题出在vs2008本身,所以 error PRJ0003错误的解决方法........
解决方案:

工具—>选项—>项目和解决方案—>VC++目录,在可执行文件栏中加上如下路径:
$(SystemRoot)\System32
$(SystemRoot)
$(SystemRoot)\System32\wbem
参考技术B 可能是环境变量卸载的时候没清理干净或者VS里配置了卸载之前的CMake的东西 参考技术C 我刚才也出现了这个问题
我这里我不知道是不是因为我后来安装了VS2012 导致VS2010 出现了某些问题,从而使得CMAKE 在用VS2010 的时候提示了错误。
后来我直接用VS2012 来生成项目了。
参考技术D 解决办法:
第一种:卸载并重装Cmake,重装时记得选择语言的类型,这种办法是一个笨办法
第二中:在源项目框中随便选择一个含CMakeLists.txt的正确目录;在输出目录的文本框中填写一个不存在的目录,再点击设置(Configuer),这时会提示你是否创建目录,点"是"
这时会弹出一个语言选择窗口,在下拉中选中你用的语言种类,即已安装的你当前用的Vs2010;
第5个回答  2012-03-28 同问 第6个回答  2012-05-12 同问,我也总是出现这个问题!怎么解决的

无法在 CMAKE 中复制文件:复制文件时出错

【中文标题】无法在 CMAKE 中复制文件:复制文件时出错【英文标题】:Could not copy file in CMAKE:Error copying file 【发布时间】:2019-05-16 13:04:46 【问题描述】:

我正在尝试将我的 CMake 项目的输出复制到另一个目录,但它不起作用。它说:复制文件时出错。

我的项目如下所示:

A----
    |----B 
    |    |
    |    |
    |    |-----CmakeListB 
    |
    | 
    |
    | 
    |
    |-----C
    |     |
    |     |
    |     |------CmakeListC       
    |
    |
    |-----CmakeListA   

A 是我最重要的项目。 B是A子项目,建dll C是一个子项目,用来构建exe

我上面描述的无关紧要。

我尝试将B构建的dll复制到另一个目录,我这样写命令,但它不起作用。(在Windows7,VS2017上)

   add_custom_command(
TARGET HOOK_SRC POST_BUILD 
COMMAND $CMAKE_COMMAND -E copy    
$CMAKE_CURRENT_BINARY_DIR/MSP_S_HOOK.dll 
$CMAKE_CURRENT_BINARY_DIR/1/MSP_S_HOOK.dll)  

CmakeList 如下所示


project(eSDK_MSP C CXX)

cmake_minimum_required(VERSION 3.8)

foreach (policy
        CMP0074)
    if (POLICY $policy)
        cmake_policy(SET $policy NEW)
    endif ()
endforeach ()


if (POLICY CMP0074)
    cmake_policy(SET CMP0074 NEW)
endif ()

set(CMAKE_CXX_STANDARD 11)

if (MSVC)

endif ()
if (MINGW OR CYGWIN)
    add_definitions(-O3)
    link_libraries(ws2_32 mswsock)
    if (USE_32BITS)
        message("build x86 target")
        set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -m32")
    else ()
        message("build x64 target")
        set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -m64")
    endif (USE_32BITS)
endif ()

ADD_DEFINITIONS(-DBOOST_COROUTINES_NO_DEPRECATION_WARNING)

macro(get_WIN32_WINNT version)
    if (WIN32 AND CMAKE_SYSTEM_VERSION)
        set(ver $CMAKE_SYSTEM_VERSION)
        string(REPLACE "." "" ver $ver)
        string(REGEX REPLACE "([0-9])" "0\\1" ver $ver)
        set($version "0x$ver")
    endif ()
endmacro()

get_WIN32_WINNT(ver)
add_definitions(-D_WIN32_WINNT=$ver)


set(Boost_USE_STATIC_LIBS ON) # enable dynamic linking
set(Boost_USE_MULTITHREAD ON)  # enable multithreading
set(Boost_USE_STATIC_RUNTIME OFF)
message($CMAKE_BINARY_DIR)

find_package(BOOST REQUIRED)

if (NOT Boost_FOUND)
    message("not found boost package")
else ()
    message("found boost package")
    include_directories($Boost_INCLUDE_DIR)
    LINK_DIRECTORIES($CMAKE_LIBRARY_PATH $ENVBOOST_LIBRARYDIR)
    message("includes: $Boost_INCLUDE_DIRS")
    message("libs: $ENVBOOST_LIBRARYDIR")
endif ()


include_directories("."
        "../MSP_S/src/window"
        )

set(HOOK_SRC
        dllmain.cpp
        ../MSP_S/src/window/ShmUtils.h
        HOOK.def)

ADD_LIBRARY(HOOK_SRC SHARED $HOOK_SRC)
target_link_libraries(HOOK_SRC wsock32 ws2_32 )
#MESSAGE(..)

if (MSVC)
#    if (CMAKE_CL_64)
#        add_custom_command(TARGET HOOK_SRC POST_BUILD
#                COMMAND $CMAKE_COMMAND -E copy
#                "MSP_S_HOOK.dll"
#                $OUTPUT_DIR"MSP_S_HOOKx64.dll")
#    else ()
#        add_custom_command(TARGET HOOK_SRC POST_BUILD
#                COMMAND $CMAKE_COMMAND -E copy
#                "MSP_S_HOOK.dll"
#                $OUTPUT_DIR"MSP_S_HOOKx86.dll")
#    endif ()
endif ()

message("hook "  $TARGET_FILE_DIr)


add_custom_command(
TARGET HOOK_SRC POST_BUILD 
COMMAND $CMAKE_COMMAND -E copy    
$CMAKE_CURRENT_BINARY_DIR/MSP_S_HOOK.dll 
$CMAKE_CURRENT_BINARY_DIR/1/MSP_S_HOOK.dll)

set_target_properties(HOOK_SRC PROPERTIES LINK_FLAGS "/INCREMENTAL:NO" LINKER_LANGUAGE C)

我能做些什么来解决这个问题?

【问题讨论】:

您是否检查过构建目录中的文件MSP_S_HOOK.dll 确实存在?据我记得,MSVC 将 add_library / add_executable 的输出工件放入基于构建配置(“Debug”、“Release”等)的子目录 为什么要复制神器。 CMake 为这些目的提供安装和打包支持。 @Tsyvarev 它确实存在。变量 $CMAKE_CURRENT_BINARY_DIR 是像这样命名为“.../vs-build/x86/debug/...”的目录 @John 怎么样?我发现没有文档可以让我弄清楚。我的母语不是英语,而且我所在的地区没有那么多 C++ 程序员,甚至没有 CMakeList,这就是我来 SOF 寻找答案的原因。 @vainman 你可以从cpack 和install 开始。没有人会阅读您的整个 CMakeLists.txt 文件。删掉所有与问题无关的部分。 【参考方案1】:

您是否尝试过使用 $PROJECT_BINARY_DIR 而不是 $CMAKE_CURRENT_BINARY_DIR? 我相信 $CMAKE_CURRENT_BINARY_DIR 只是获取您正在处理的 CMake 项目的主要二进制目录。 下面的代码可以正确复制 dll。

add_custom_command(
       TARGET HOOK_SRC POST_BUILD 
       COMMAND $CMAKE_COMMAND -E copy_if_different    
       $PROJECT_BINARY_DIR/MSP_S_HOOK.dll 
       $PROJECT_BINARY_DIR/1/MSP_S_HOOK.dll
       $<TARGET_FILE_DIR:HOOK_SRC>)

【讨论】:

以上是关于CMake出错,应该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

CMake和OpenCV结合遇到问题,OpenCVConfig.CMake

VS2010 安装Opencv2.3时出错

qt5.7.1配置opencv3.1.0的时候用cmake编译opencv总是出错。每一步都是按照网上教程来的,不知道为啥

没装gcc能用cmake吗?

json数据解析出错应该怎么办?

json数据解析出错应该怎么办