Windows下CMake交叉编译时如何移除自动添加的默认链接选项与库
移除CMake交叉编译时自动添加的默认链接选项与库
要清除CMake为Windows目标自动添加的链接选项(如-fuse-ld=lld-link、/MANIFEST:EMBED等)和系统库(如kernel32、user32等),可通过以下针对性操作实现:
一、移除默认系统库链接
CMake针对Windows平台会自动链接一批系统基础库,直接清空目标的链接库属性即可取消这一行为:
add_executable(app crt0.S main.c) # 清空目标的默认链接库列表 set_target_properties(app PROPERTIES LINK_LIBRARIES "")
也可以通过target_link_libraries直接覆盖,仅保留你需要的库(这里设为空表示不链接默认库):
target_link_libraries(app PRIVATE "")
二、移除自动添加的链接选项
1. 批量清空默认链接器标志
如果想完全自定义链接选项,直接覆盖对应CMake变量:
# 清空所有可执行文件的默认链接标志 set(CMAKE_EXE_LINKER_FLAGS "") # 针对C/C++单独清空 set(CMAKE_C_LINK_FLAGS "") set(CMAKE_CXX_LINK_FLAGS "")
2. 精准移除指定选项
如果只需移除个别选项,用string(REPLACE)操作对应变量:
- 移除Manifest嵌入选项:
string(REPLACE "-Xlinker /MANIFEST:EMBED" "" CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
- 移除PDB生成选项(Debug模式):
string(REPLACE "-Xlinker /pdb:app.pdb" "" CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}")
- 移除版本号选项:
string(REPLACE "-Xlinker /version:0.0" "" CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
- 移除lld-link指定:
string(REPLACE "-fuse-ld=lld-link" "" CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
3. 查看并修改目标当前链接属性
如果不确定残留的选项来自哪里,可先查看目标的链接属性,再针对性删除:
add_executable(app crt0.S main.c) # 获取目标当前的链接标志 get_target_property(CURRENT_LINK_FLAGS app LINK_FLAGS) # 移除指定不需要的选项 string(REPLACE "要删除的选项内容" "" CURRENT_LINK_FLAGS "${CURRENT_LINK_FLAGS}") # 重新设置目标链接标志 set_target_properties(app PROPERTIES LINK_FLAGS "${CURRENT_LINK_FLAGS}")
三、整合示例
修改后的CMakeLists.txt可参考如下:
cmake_minimum_required(VERSION 3.12.0) project(app VERSION 0.1.0) enable_language(CXX C ASM) set(CMAKE_BUILD_TYPE Debug) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD 98) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_STANDARD 99) # cross compile include(${CMAKE_SOURCE_DIR}/cross_compile.cmake) # 清空默认链接器标志 set(CMAKE_EXE_LINKER_FLAGS "") set(CMAKE_C_LINK_FLAGS "") set(CMAKE_CXX_LINK_FLAGS "") add_executable(app crt0.S main.c) # 清空默认系统库链接 set_target_properties(app PROPERTIES LINK_LIBRARIES "") # 按需添加自定义链接选项或库 # target_link_options(app PRIVATE "你的自定义链接选项") # target_link_libraries(app PRIVATE "你的自定义库")
内容的提问来源于stack exchange,提问作者mxmxlwlw
相关产品推荐
相关产品推荐

