我有以下文件
main.cpp:
#include "f.h"
int main(){
f();
}
f.h:
int f();
f.cpp:
int f(){
int x=1;
}
首先,我将 f.cpp
编译成目标文件:gcc -c f.cpp -O0
并使用此目标文件编译 main.cpp
gcc f.o main.cpp
。
执行 gdb a.out
,info functions
显示 f()
。执行 strip a.out
将其删除。
我想用 Cmake 做同样的事情。我用主目录 f
和 main
创建了以下目录结构:
f
build
src
f.h
f.c
CMakeLists.txt
CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.8)
project(f)
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O0")
add_library(f OBJECT
f.cpp
)
main
build
src
main.cpp
CMakeLists.txt
CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.8)
project(main)
set(CMAKE_BUILD_TYPE Release)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../../f/src
${CMAKE_CURRENT_SOURCE_DIR}/../../f/build)
add_executable(main
main.cpp
$<TARGET_OBJECTS:f>
)
我先在 f
中运行 cmake
和 make
,然后在 main
中运行。我得到了带有 f()
的 main
可执行文件。但是发出 strip main
,甚至 strip -s main
都不会删除符号名称 f()
。
- 如果我使用 Cmake,为什么不删除
strip
符号名称? - 有没有办法使用 Cmake 以相同的方式编译我的文件(来自 f.cpp 的目标文件和主可执行文件之后),并从可执行文件中删除符号名称?
最佳答案
我从未使用过 strip,但根据 this article您可以使用 -s
编译器选项实现相同的效果。您可以尝试将 -s
添加到 CMAKE_CXX_FLAGS_RELEASE
。看起来它们可能不是 entirely equivalent虽然。
关于c++ - 无法从使用 Cmake 创建的可执行文件中删除符号名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35430326/