【发布时间】:2014-02-05 05:40:26
【问题描述】:
我正在使用 cmake 2.8.0 构建具有多个项目的 VS2012 解决方案。对于每个项目,我希望将每个项目的属性->链接器-> 启用增量链接设置为NO。
可能会使用 CMAKE_EXE_LINKER_FLAGS_DEBUG 等标志。不过我不确定,尝试了一些在线帮助也没有效果。
请指教
【问题讨论】:
标签: c++ visual-studio-2012 cmake
我正在使用 cmake 2.8.0 构建具有多个项目的 VS2012 解决方案。对于每个项目,我希望将每个项目的属性->链接器-> 启用增量链接设置为NO。
可能会使用 CMAKE_EXE_LINKER_FLAGS_DEBUG 等标志。不过我不确定,尝试了一些在线帮助也没有效果。
请指教
【问题讨论】:
标签: c++ visual-studio-2012 cmake
你应该设置/INCREMENTAL:NO linker flag。
要在 CMake 中覆盖它,您应该遵循How to add linker or compile flag in cmake file? 中提供的技术:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /INCREMENTAL:NO" )
【讨论】:
SET(MSVC_INCREMENTAL_DEFAULT ON) PROJECT(XXX) 上方添加以下行是否正确?
我设法找到了解决方案。显然许多其他标志也需要设置为 /INCREMENTAL:NO
FOREACH(FLAG_TYPE EXE MODULE SHARED)
STRING (REPLACE "INCREMENTAL:YES" "INCREMENTAL:NO" FLAG_TMP
"${CMAKE_${FLAG_TYPE}_LINKER_FLAGS_DEBUG}")
STRING (REPLACE "/EDITANDCONTINUE" "" FLAG_TMP
"${CMAKE_${FLAG_TYPE}_LINKER_FLAGS_DEBUG}")
SET(CMAKE_${FLAG_TYPE}_LINKER_FLAGS_DEBUG "/INCREMENTAL:NO ${FLAG_TMP}" CACHE
STRING "Overriding default debug ${FLAG_TYPE} linker flags." FORCE)
MARK_AS_ADVANCED (CMAKE_${FLAG_TYPE}_LINKER_FLAGS_DEBUG)
ENDFOREACH ()
【讨论】:
适合我的解决方案是:
if(WIN32)
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/INCREMENTAL:NO")
endif()
【讨论】:
检查WIN32 是不够的。 The flag only means that the target system is Windows.
因此,如果我们在 Windows 上使用 GCC 或任何其他编译器进行构建,/INCREMENTAL 标志将失败,因为它是 MSVC 特定的。
对于 CMake >= 3.13,应该这样做。
if(MSVC)
target_link_options(${TARGET_NAME} <INTERFACE|PUBLIC|PRIVATE>
# $<$<CONFIG:Debug>:/INCREMENTAL> is active by default for debug
$<$<CONFIG:Release>:/INCREMENTAL:NO>
)
endif()
【讨论】: