为什么 cmake 生成带有 debug_info 的二进制文件而不是剥离
why is cmake producing a binary with debug_info and not stripped
为什么 cmake 生成带有 debug_info 的二进制文件而不是剥离?
这是我的 CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
# project name
project(c-program)
set(CMAKE_C_COMPILER "/usr/bin/gcc")
set(CMAKE_C_STANDARD "90")
set(CMAKE_C_STANDARD_REQUIRED true)
set(CMAKE_C_FLAGS "-ansi -Wall")
set(CMAKE_C_FLAGS_DEBUG "-g3 -ggdb3")
set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG")
add_executable(c-program c-program.c)
我从项目根文件夹这样构建
$ cmake -S . -B build/release -DCMAKE_BUILD_TYPE=Release
$ cmake --build build/release
当运行
$ file build/release/c-program
我得到
build/release/c-program: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-x86_64.so.1, with debug_info, not stripped
我对 debug/release 构建应该如何工作感到困惑,cmake 教程指南或文档或其他在线内容都无法帮助我弄清楚为什么会这样
在 CMakeLists.txt
中设置标志存在一些问题,因此添加和使用工具链文件有帮助,并在工具链文件中设置适当的 CMAKE_<LANG>_FLAGS_<CONFIG>_INIT
变量。此外,链接器正在添加调试信息。将 -s
标志添加到 cmake 发布标志,并将 -Wl,--strip-debug
添加到链接器标志是我一直在寻找的
这是我最后的 CMakeLists.txt
和 toolchain
文件
#CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
# set toolchain file
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/toolchain.cmake"
CACHE PATH "Path to the desired toolchain file.")
# project name
project(c-program C)
add_executable(c-program c-program.c)
# toolchain.cmake
# CMake toolchain file
# c compiler and standard
set(CMAKE_C_COMPILER "/usr/bin/gcc")
set(CMAKE_C_STANDARD "90")
set(CMAKE_C_STANDARD_REQUIRED YES)
# linker flags
set(CMAKE_EXE_LINKER_FLAGS_INIT "-Wl,--strip-debug")
# cflags
set(CMAKE_C_FLAGS_INIT "-ansi -Wall")
# cflags for debug build
set(CMAKE_C_FLAGS_DEBUG_INIT "-g3 -ggdb3")
# cflags for release build
set(CMAKE_C_FLAGS_RELEASE_INIT "-O3 -DNDEBUG -s")
为什么 cmake 生成带有 debug_info 的二进制文件而不是剥离?
这是我的 CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
# project name
project(c-program)
set(CMAKE_C_COMPILER "/usr/bin/gcc")
set(CMAKE_C_STANDARD "90")
set(CMAKE_C_STANDARD_REQUIRED true)
set(CMAKE_C_FLAGS "-ansi -Wall")
set(CMAKE_C_FLAGS_DEBUG "-g3 -ggdb3")
set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG")
add_executable(c-program c-program.c)
我从项目根文件夹这样构建
$ cmake -S . -B build/release -DCMAKE_BUILD_TYPE=Release
$ cmake --build build/release
当运行
$ file build/release/c-program
我得到
build/release/c-program: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-x86_64.so.1, with debug_info, not stripped
我对 debug/release 构建应该如何工作感到困惑,cmake 教程指南或文档或其他在线内容都无法帮助我弄清楚为什么会这样
在 CMakeLists.txt
中设置标志存在一些问题,因此添加和使用工具链文件有帮助,并在工具链文件中设置适当的 CMAKE_<LANG>_FLAGS_<CONFIG>_INIT
变量。此外,链接器正在添加调试信息。将 -s
标志添加到 cmake 发布标志,并将 -Wl,--strip-debug
添加到链接器标志是我一直在寻找的
这是我最后的 CMakeLists.txt
和 toolchain
文件
#CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
# set toolchain file
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/toolchain.cmake"
CACHE PATH "Path to the desired toolchain file.")
# project name
project(c-program C)
add_executable(c-program c-program.c)
# toolchain.cmake
# CMake toolchain file
# c compiler and standard
set(CMAKE_C_COMPILER "/usr/bin/gcc")
set(CMAKE_C_STANDARD "90")
set(CMAKE_C_STANDARD_REQUIRED YES)
# linker flags
set(CMAKE_EXE_LINKER_FLAGS_INIT "-Wl,--strip-debug")
# cflags
set(CMAKE_C_FLAGS_INIT "-ansi -Wall")
# cflags for debug build
set(CMAKE_C_FLAGS_DEBUG_INIT "-g3 -ggdb3")
# cflags for release build
set(CMAKE_C_FLAGS_RELEASE_INIT "-O3 -DNDEBUG -s")