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生成的东西也删除了,现在又要用,但是总是这个地方报错,非常头痛。。。
请问我该怎么做啊?
解决方案:
工具—>选项—>项目和解决方案—>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
qt5.7.1配置opencv3.1.0的时候用cmake编译opencv总是出错。每一步都是按照网上教程来的,不知道为啥