如何阻止CMake为特定项目显式链接user32.lib等系统库
阻止CMake生成的VS特定项目链接user32.lib
问题场景
以CMake官方示例项目为例,代码如下:
cmake_minimum_required(VERSION 3.10) # set the project name project(Tutorial) # add the executable add_executable(Tutorial tutorial.h) set_target_properties(Tutorial PROPERTIES LINKER_LANGUAGE CXX)
生成Visual Studio解决方案后,项目属性的「配置属性-链接器-输入-附加依赖项」会包含大量系统库。需要仅针对该特定项目取消链接user32.lib,手动修改VS项目的「忽略特定默认库」设置有效,但每次CMake重新生成解决方案后,该设置会被重置。
需求背景:测试项目需通过链接替换(link seam)技术mock系统调用。
解决方案
直接在CMake配置中为目标添加链接器忽略库的选项,无需手动修改VS项目:
方法一(推荐,CMake 3.13+)
使用target_link_options为指定目标设置私有链接选项:
# 在add_executable之后添加 target_link_options(Tutorial PRIVATE "/NODEFAULTLIB:user32.lib")
方法二
通过set_target_properties设置目标的链接标志:
# 在add_executable之后添加 set_target_properties(Tutorial PROPERTIES LINK_FLAGS "/NODEFAULTLIB:user32.lib" )
说明
PRIVATE关键字确保该链接选项仅作用于Tutorial目标,不会影响其他依赖它的项目,满足“仅特定项目生效”的需求。/NODEFAULTLIB:user32.lib是Visual Studio链接器的专用参数,明确告知链接器忽略默认引入的user32.lib库。
内容的提问来源于stack exchange,提问作者KulaGGin
相关产品推荐
相关产品推荐

