如何让C++程序避免被strings命令查出源文件路径?
解决二进制文件中残留源文件路径的问题
1. 先把-g选项去掉!
你之前加的-g是用来生成调试信息的,这玩意儿会把完整的源文件路径直接嵌进二进制里,完全是反效果。赶紧在CMake里移除这个配置:
# 确保Release模式下不要带-g set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2")
2. 正确用strip清理符号
-s是链接时的strip选项,但有时候单独用这个不够彻底,建议编译完直接手动strip:
strip --strip-all myProgram
或者让CMake自动帮你做:
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -s")
3. 处理__FILE__宏带来的路径
很多代码会用__FILE__打日志,这个宏会被替换成完整路径。用GCC/Clang的话,可以直接把路径替换成相对路径或文件名:
# 把绝对路径替换成当前目录的相对路径 add_compile_options(-ffile-prefix-map=${CMAKE_SOURCE_DIR}=.) # 或者只保留文件名 add_compile_definitions(__FILE__=\"$(notdir ${CMAKE_CURRENT_SOURCE_DIR})/\")
4. 强制vcpkg用Release模式编译依赖
vcpkg装的库如果是Debug版本,链接后也会把它的源文件路径带进你的二进制。在CMakeLists最开头加这个,强制依赖用Release编译:
set(VCPKG_BUILD_TYPE release)
5. 验证结果
重新编译后跑一遍命令看看:
strings myProgram | grep '.cc'
应该就不会再出现那些烦人的vcpkg或本地绝对路径了。
内容的提问来源于stack exchange,提问作者Jinha Hwang
相关产品推荐
相关产品推荐

