无法在 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 中复制文件:复制文件时出错的主要内容,如果未能解决你的问题,请参考以下文章

将文档目录中的文件复制到文档目录中的目录时出错

手机js文件无法复制电脑

Windows 技术篇 - win10复制文件或文件夹时出错,提示“文件或目录损坏且无法读取“问题解决。windows驱动器磁盘修复方法

无法移动、剪切、复制文件 出现指定的文件名无效或太长

手机往电脑上复制PCK文件错误,为啥?

将现有音频文件复制到另一个目标时出错