c++ - 使用 CMake 构建 project.sln 时发布构建事件错误

标签 c++ cmake visual-studio-2017 post-build-event

我的任务是将大型框架转换并构建为 CMake 树和二进制文件。目前,该框架是使用 VS 2017 构建的,创建了一个名为 Framework_static_vc15.sln 的解决方案。由于这是一个大型项目,我选择使用转换器为该项目的每个部分创建 CMakeLists.txt 文件。这是我使用的转换器的链接。

https://cmakeconverter.readthedocs.io/en/develop/intro.html

此转换器成功创建了所需的所有文本文件,我可以运行命令

cmake -S . -B build

创建一个我应该能够运行cmake --build build的目录。 但是,当我运行上述命令时,构建每次都会失败,并出现以下错误

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: The command "setlocal [C:\Work\SVN\Software\Framework\build\Source\UeiDaqCore\UeiDaqCore_vc15.vcx
proj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: cd C:\Work\SVN\Software\Framework\Source\UeiDaqCore [C:\Work\SVN\Software\Framework\build\Source\
UeiDaqCore\UeiDaqCore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd [C:\Work\SVN\Software\Framework\build\Source\UeiDaqCore\UeiDaqC
ore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: C: [C:\Work\SVN\Software\Framework\build\Source\UeiDaqCore\UeiDaqCore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd [C:\Work\SVN\Software\Framework\build\Source\UeiDaqCore\UeiDaqC
ore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: if not exist ..\..\CPP\lib mkdir ..\..\CPP\lib [C:\Work\SVN\Software\Framework\build\Source\UeiDa
qCore\UeiDaqCore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd [C:\Work\SVN\Software\Framework\build\Source\UeiDaqCore\UeiDaqC
ore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: copy C:\Work\SVN\Software\Framework\Source\UeiDaqCore\..\..\Output\Win32\vs15_DebugUeiDaqvc15SD.l
ib ..\..\CPP\lib [C:\Work\SVN\Software\Framework\build\Source\UeiDaqCore\UeiDaqCore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd [C:\Work\SVN\Software\Framework\build\Source\UeiDaqCore\UeiDaqC
ore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: cd.      [C:\Work\SVN\Software\Framework\build\Source\UeiDaqCore\UeiDaqCore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd [C:\Work\SVN\Software\Framework\build\Source\UeiDaqCore\UeiDaqC
ore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: cd.   [C:\Work\SVN\Software\Framework\build\Source\UeiDaqCore\UeiDaqCore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd [C:\Work\SVN\Software\Framework\build\Source\UeiDaqCore\UeiDaqC
ore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: :cmEnd [C:\Work\SVN\Software\Framework\build\Source\UeiDaqCore\UeiDaqCore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone [C:\Work\SVN\Software\Framework\build\S
ource\UeiDaqCore\UeiDaqCore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: :cmErrorLevel [C:\Work\SVN\Software\Framework\build\Source\UeiDaqCore\UeiDaqCore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: exit /b %1 [C:\Work\SVN\Software\Framework\build\Source\UeiDaqCore\UeiDaqCore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: :cmDone [C:\Work\SVN\Software\Framework\build\Source\UeiDaqCore\UeiDaqCore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: if %errorlevel% neq 0 goto :VCEnd [C:\Work\SVN\Software\Framework\build\Source\UeiDaqCore\UeiDaqC
ore_vc15.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1
38,5): error MSB3073: :VCEnd" exited with code 1. [C:\Work\SVN\Software\Framework\build\Source\UeiDaqCore\UeiDaqCore_vc
15.vcxproj]

此错误来自名为 UeiDaqCore 的子项目内的构建后事件,当 CMake 尝试执行以下命令时会出现该错误 UeiDaqCore_vc15.vcxproj -> C:\Work\SVN\Software\Framework\Output\Win32\vs15_Debug\UeiDaqCore_vc15SD.lib。 CMake 为我提供了没有所有路径的错误列表,就在这里。

PostBuildEvent:
  setlocal
  cd C:\Work\SVN\Software\Framework\Source\UeiDaqCore
  if %errorlevel% neq 0 goto :cmEnd
  C:
  if %errorlevel% neq 0 goto :cmEnd
  if not exist ..\..\CPP\lib mkdir ..\..\CPP\lib
  if %errorlevel% neq 0 goto :cmEnd
  copy C:\Work\SVN\Software\Framework\Source\UeiDaqCore\..\..\Output\Win32\vs15_DebugUeiDaqvc15SD.lib ..\..\CPP\lib
  if %errorlevel% neq 0 goto :cmEnd
  cd.
  if %errorlevel% neq 0 goto :cmEnd
  cd.
  if %errorlevel% neq 0 goto :cmEnd
  :cmEnd
  endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
  :cmErrorLevel
  exit /b %1
  :cmDone
  if %errorlevel% neq 0 goto :VCEnd
  :VCEnd
  The system cannot find the file specified.

我查看了 Visual Studio UeiDaqCore 项目文件中名为 setlocal 的构建后事件,还查看了 CmakeLists.txt 文件中的 setlocal 构建后事件,但是找不到。 从错误文本来看,它似乎正在寻找名为 UeiDaqCore_vc15.vcxproj 的项目和名为 UeiDaqCore_vc15SD.lib 的文件,但找不到它。我不确定为什么,因为这两个文件都位于其查找的文件夹中。

我正在使用管理员命令提示符运行 CMake,因为我见过其他人遇到过此问题,并且这是由没有管理员权限引起的。下面,我将发布 UeiDaqCore 子项目的完整 CmakeLists.txt。

project(UeiDaqCore_vc15 CXX)

################################################################################
# Source groups
################################################################################
set(no_group_source_files
    ReadMe.txt
)
source_group("" FILES ${no_group_source_files})

set(Headers
    ../../CPP/include/UeiChannel.h
    ../../CPP/include/UeiConstants.h
    ../../CPP/include/UeiCustomScale.h
    ../../CPP/include/UeiDaq.h
    ../../CPP/include/UeiDaqAnsiC.h
    ../../CPP/include/UeiDaqError.h
    ../../CPP/include/UeiDataStream.h
    ../../CPP/include/UeiDevice.h
    ../../CPP/include/UeiDeviceEnumerator.h
    ../../CPP/include/UeiDriverEnumerator.h
    ../../CPP/include/UeiEvent.h
    ../../CPP/include/UeiException.h
    ../../CPP/include/UeiFrameUtils.h
    ../../CPP/include/UeiMessaging.h
    ../../CPP/include/UeiObject.h
    ../../CPP/include/UeiReader.h
    ../../CPP/include/UeiResourceParser.h
    ../../CPP/include/UeiSession.h
    ../../CPP/include/UeiSessionGroup.h
    ../../CPP/include/UeiStructs.h
    ../../CPP/include/Ueisystem.h
    ../../CPP/include/UeiTiming.h
    ../../CPP/include/UeiTrigger.h
    ../../CPP/include/UeiWriter.h
    pugxml.h
    resource.h
    ResourceParser.h
    SensorConversion.h
    SignalParser.h
    StdAfx.h
    UeiAnsiCSession.h
    UeiChannelimpl.h
    UeiCJCConverter.h
    UeiDaqCore.h
    UeiDaqCoreVer.h
    UeiDaqDriver.h
    UeiDaqDriverSession.h
    UeiDaqLV.h
    UeiDataStreamImpl.h
    UeiDeviceEnumeratorImpl.h
    UeiDeviceImpl.h
    UeiDriverEvent.h
    UeiMessagingImpl.h
    UeiObjectImpl.h
    UeiReaderImpl.h
    UeiRTDConverter.h
    UeiSessionImpl.h
    UeiSessionSettings.h
    UeiTimingImpl.h
    UeiTriggerImpl.h
    UeiWriterImpl.h
    UeiXmlParser.h
)
source_group("Headers" FILES ${Headers})

set(Sources
    ResourceParser.cpp
    SensorConversion.cpp
    StdAfx.cpp
    UeiChannel.cpp
    UeiChannelImpl.cpp
    UeiCJCConverter.cpp
    UeiCustomScale.cpp
    UeiDaqAnsiC.cpp
    UeiDaqCore.cpp
    UeiDaqLV.cpp
    UeiDataStream.cpp
    UeiDataStreamImpl.cpp
    UeiDevice.cpp
    UeiDeviceEnumerator.cpp
    UeiDeviceEnumeratorImpl.cpp
    UeiDeviceImpl.cpp
    UeiDriverEnumerator.cpp
    UeiException.cpp
    UeiFrameUtils.cpp
    UeiMessaging.cpp
    UeiMessagingImpl.cpp
    UeiObject.cpp
    UeiObjectImpl.cpp
    UeiReader.cpp
    UeiReaderImpl.cpp
    UeiResourceParser.cpp
    UeiRTDConverter.cpp
    UeiSession.cpp
    UeiSessionGroup.cpp
    UeiSessionImpl.cpp
    UeiSessionSettings.cpp
    UeiSystem.cpp
    UeiTiming.cpp
    UeiTimingImpl.cpp
    UeiTrigger.cpp
    UeiTriggerImpl.cpp
    UeiWriter.cpp
    UeiWriterImpl.cpp
    UeiXmlParser.cpp
)
source_group("Sources" FILES ${Sources})

set(ALL_FILES
    ${no_group_source_files}
    ${Headers}
    ${Sources}
)

################################################################################
# Target
################################################################################
add_library(${PROJECT_NAME} STATIC ${ALL_FILES})

add_precompiled_header(${PROJECT_NAME} "StdAfx.h" "StdAfx.cpp")

use_props(${PROJECT_NAME} "${CMAKE_CONFIGURATION_TYPES}" "${DEFAULT_CXX_PROPS}")
set(ROOT_NAMESPACE UeiDaqCore)

################################################################################
# Target name
################################################################################
set_target_properties(${PROJECT_NAME} PROPERTIES
    TARGET_NAME_DEBUG   "${PROJECT_NAME}SD"
    TARGET_NAME_RELEASE "${PROJECT_NAME}S"
)
################################################################################
# Output directory
################################################################################
set_target_properties(${PROJECT_NAME} PROPERTIES
    OUTPUT_DIRECTORY_DEBUG   "${CMAKE_CURRENT_SOURCE_DIR}/../../Output/${CMAKE_VS_PLATFORM_NAME}/vs15_$<CONFIG>"
    OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/../../Output/${CMAKE_VS_PLATFORM_NAME}/vs15_$<CONFIG>"
)
################################################################################
# Include directories
################################################################################
target_include_directories(${PROJECT_NAME} PUBLIC
    "${CMAKE_CURRENT_SOURCE_DIR}/../../CPP/include;"
    "$ENV{UEICOMMON}/includes"
)

################################################################################
# Compile definitions
################################################################################
target_compile_definitions(${PROJECT_NAME} PRIVATE
    "$<$<CONFIG:Debug>:"
        "_DEBUG;"
        "UEIDAQ_DEBUG"
    ">"
    "$<$<CONFIG:Release>:"
        "NDEBUG"
    ">"
    "WIN32;"
    "_WINDOWS;"
    "UEIDAQSTATIC;"
    "__MSWINDOWS__;"
    "_MBCS"
)
set_source_files_properties(ResourceParser.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(StdAfx.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;UEIDAQSTATIC"
)
set_source_files_properties(UeiChannel.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiChannelImpl.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiDaqCore.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiDataStream.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiDataStreamImpl.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiDevice.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiDeviceEnumerator.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiDeviceEnumeratorImpl.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiDeviceImpl.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiException.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiObject.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiObjectImpl.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiSession.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiSessionGroup.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiSessionImpl.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiTiming.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiTimingImpl.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiTrigger.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)
set_source_files_properties(UeiTriggerImpl.cpp PROPERTIES
    COMPILE_DEFINITIONS_DEBUG "_DEBUG"
    COMPILE_DEFINITIONS_RELEASE "NDEBUG"
    COMPILE_DEFINITIONS "WIN32;_WINDOWS;_MBCS;_USRDLL;UEIDAQCORE_EXPORTS"
)

################################################################################
# Compile and link options
################################################################################
if(MSVC)
    target_compile_options(${PROJECT_NAME} PRIVATE
        $<$<CONFIG:Debug>:
            /Od;
            /RTC1;
            /MTd
        >
        $<$<CONFIG:Release>:
            /O2;
            /Ob1;
            /GF;
            /MT;
            /Gy
        >
        /W3;
        /nologo;
        /Zi;
        /GR;
        ${DEFAULT_CXX_EXCEPTION_HANDLING}
    )
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(ResourceParser.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(StdAfx.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiChannel.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiChannelImpl.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiDaqCore.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiDataStream.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiDataStreamImpl.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiDevice.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiDeviceEnumerator.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiDeviceEnumeratorImpl.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiDeviceImpl.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiException.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiObject.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiObjectImpl.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiSession.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiSessionGroup.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiSessionImpl.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiTiming.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiTimingImpl.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiTrigger.cpp ${FILE_CL_OPTIONS})
    string(CONCAT FILE_CL_OPTIONS
        "$<$<CONFIG:Debug>:"
            "/Od;/RTC1"
        ">"
        "$<$<CONFIG:Release>:"
            "/O2"
        ">"
    )
    source_file_compile_options(UeiTriggerImpl.cpp ${FILE_CL_OPTIONS})
endif()

################################################################################
# Post build events
################################################################################
add_custom_command_if(
    TARGET ${PROJECT_NAME}
    POST_BUILD
    COMMANDS
    COMMAND   $<CONFIG:Debug> if not exist ..\\..\\CPP\\lib mkdir ..\\..\\CPP\\lib
    COMMAND   $<CONFIG:Debug> copy $<SHELL_PATH:${OUTPUT_DIRECTORY}>UeiDaqvc15SD.lib ..\\..\\CPP\\lib
    COMMAND $<CONFIG:Release> if not exist ..\\..\\CPP\\lib mkdir ..\\..\\CPP\\lib
    COMMAND $<CONFIG:Release> copy $<SHELL_PATH:${OUTPUT_DIRECTORY}>UeiDaqvc15S.lib ..\\..\\CPP\\lib
)

################################################################################
# Dependencies
################################################################################
add_dependencies(${PROJECT_NAME}
    UeiPDNADriver_vc15
    UeiSimuDriver_vc15
)

# Link with other targets.
target_link_libraries(${PROJECT_NAME} PUBLIC
    UeiPDNADriver_vc15
    UeiSimuDriver_vc15
)

我对 CMake 还很陌生,如果对可能的解决方案有任何帮助,我们将不胜感激。

编辑:以下是直接从 Visual Studio 窗口复制的 UeiDaqCore 的构建后事件。

copy "$(SolutionDir)\Output\$(Platform)\vs15_$(Configuration)\UeiDaqvc15D.dll" "$(SystemRoot)\System32"
if not exist ..\..\CPP\lib mkdir ..\..\CPP\lib
copy "$(SolutionDir)\Output\$(Platform)\vs15_$(Configuration)\UeiDaqvc15D.lib" ..\..\CPP\lib

最佳答案

看起来像 POST_BUILD自定义命令格式错误。具体来说,copy命令未在定义的 OUTPUT_DIRECTORY 之间放置路径分隔符:

C:\Work\SVN\Software\Framework\Source\UeiDaqCore\..\..\Output\Win32\vs15_Debug

从文件名:

UeiDaqvc15SD.lib

所以它们被(错误地)连接起来:

C:\Work\SVN\Software\Framework\Source\UeiDaqCore\..\..\Output\Win32\vs15_DebugUeiDaqvc15SD.lib

尝试添加路径分隔符\\$<SHELL_PATH:${OUTPUT_DIRECTORY}> 之后的自定义命令中:

add_custom_command_if(
    TARGET ${PROJECT_NAME}
    POST_BUILD
    COMMANDS
    COMMAND   $<CONFIG:Debug> if not exist ..\\..\\CPP\\lib mkdir ..\\..\\CPP\\lib
    COMMAND   $<CONFIG:Debug> copy $<SHELL_PATH:${OUTPUT_DIRECTORY}>\\UeiDaqvc15SD.lib ..\\..\\CPP\\lib
    COMMAND $<CONFIG:Release> if not exist ..\\..\\CPP\\lib mkdir ..\\..\\CPP\\lib
    COMMAND $<CONFIG:Release> copy $<SHELL_PATH:${OUTPUT_DIRECTORY}>\\UeiDaqvc15S.lib ..\\..\\CPP\\lib
)

关于c++ - 使用 CMake 构建 project.sln 时发布构建事件错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58858328/

相关文章:

c++ - 包含 boost/thread.cpp 时出现编译错误

windows - 如何在 Windows 中使用 cmake 更轻松地链接 gtk 库?

azure-mobile-services - 添加 "Azure Mobile Apps Table Controller"时出错

android - Xamarin 形成 Android 工具栏以在滚动时展开/折叠

c++ - 基于模板的 switch 语句的 if constexpr

c++ - 为什么 C++ 允许未命名的函数参数?

c# - C#中如何在类外定义构造函数

DHT的C++实现

c++ - 将 QT5 库添加到 CMake

macos - 让 cmake 和 home-brew 一起工作