无法在 CMAKE 中复制文件:复制文件时出错
Posted
技术标签:
【中文标题】无法在 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 中复制文件:复制文件时出错的主要内容,如果未能解决你的问题,请参考以下文章
Windows 技术篇 - win10复制文件或文件夹时出错,提示“文件或目录损坏且无法读取“问题解决。windows驱动器磁盘修复方法