如何在使用C++ CMake项目的 Visual Studio 2022 中启用热重载功能?

4
我有一个CMake项目,使用Visual Studio 2022进行处理。我尝试在调试过程中更改代码并单击“热重新加载”按钮,但是出现以下消息:
“进行了无法编译的编辑”
在Visual Studio输出窗口中出现以下消息:
'mylib.dll'中的'Canvas.cpp'未启用编辑并继续连接。确保启用了/INCREMENTAL链接,并且没有忽略/EDITANDCONTINUE指令。
考虑到这将是一个跨平台项目,那么在CMakeLists.txt中应该如何正确实现呢?
以下是我的CMakeLists.txt:
cmake_minimum_required (VERSION 3.18)

project (my-project)

add_definitions (-DMY_PROJECT_EXPORTS)

set (CMAKE_INCLUDE_CURRENT_DIR ON)
set (CMAKE_AUTOMOC ON)
set (CMAKE_AUTOUIC ON)
set (CMAKE_AUTORCC ON)

find_package (Qt5 COMPONENTS Core Gui Widgets REQUIRED)

include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../..)

set (PROJECT_SRC
  # A bunch of files, i.e.
  Private/Canvas.cpp
  Private/View.cpp
  Private/Scene.cpp
)

add_library (${PROJECT_NAME} SHARED ${PROJECT_SRC})
target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_17)
target_link_libraries(${PROJECT_NAME} PUBLIC
  Qt5::Widgets
  Qt5::Gui
)
1个回答

4

检查目标系统,如果构建系统是msvc并且使用了哪个工具集版本,应该允许您添加所有必要的限制。只需在满足正确条件的情况下添加/INCREMENTAL链接选项即可。

注意:我不确定所有这些条件是否必要,以及哪个工具集版本是支持此功能的第一个版本,但您可以仅检查所需支持的版本的选项。

if (MSVC AND WIN32 AND NOT MSVC_VERSION VERSION_LESS 142)

    # option 1: put the following command before the creation of the first
    #           compiled target you want to apply the option to;
    #           this applies to targets created in this dir and subdirectories
    add_link_option($<$<CONFIG:Debug>:/INCREMENTAL>)
    add_compile_option($<$<CONFIG:Debug>:/ZI>)

    # option 2: apply the option on a per-target basis
    target_link_options(${PROJECT_NAME} PRIVATE $<$<CONFIG:Debug>:/INCREMENTAL>)
    target_compile_options(${PROJECT_NAME} PRIVATE $<$<CONFIG:Debug>:/ZI>)

endif()

如果您想使用选项2并需要将其应用于多个目标,则可能可以创建一个自定义函数,该函数可以无条件地应用于所有您想要应用该选项的目标。
我不知道是否有任何替代方案可以让您为支持该功能的所有编译器启用此类功能。
您可能希望添加一个选项以通过cmake缓存设置禁用此功能,并将其添加到if中执行的检查中。
您可能仍然需要在Visual Studio选项中启用该功能,如此处所述:https://learn.microsoft.com/en-us/visualstudio/debugger/how-to-enable-and-disable-edit-and-continue?view=vs-2022

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接