如何从C++静态库中去除调试符号与归档内目标文件名?
解决Mac上clang编译静态库的两个问题
我来帮你搞定这两个静态库处理的问题,都是LLVM工具链自带命令就能解决的:
一、移除静态库中的调试符号
有两种方式可以处理,选适合你的场景:
- 编译阶段直接避免生成调试符号:在编译每个源文件为目标文件(.o)时,加上
-g0参数,这样生成的.o文件本身就不带调试符号,归档成静态库后自然也没有。示例命令:clang -c -g0 firstobjectfile.cpp -o firstobjectfile.o - 事后移除已生成静态库的调试符号:用
strip工具直接处理静态库文件,-S参数会移除调试符号但保留必要的符号表(适合发布版本),命令如下:
如果想要彻底移除所有符号(不推荐,除非你确定不需要任何符号信息),可以用strip -S libmylib_DARWIN.a strip -S libmylib_LINUX.a-x参数替换-S。
二、修改归档中的目标文件名(otool显示的名称)
静态库本质是ar工具创建的归档文件,我们可以先提取里面的.o文件,重命名后重新归档:
- 提取归档中的所有目标文件:
# 处理Darwin版本的库 ar x libmylib_DARWIN.a # 处理Linux版本的库(如果在Mac上交叉编译的,同样操作) ar x libmylib_LINUX.a - 批量重命名目标文件:
比如你想去掉.cpp后缀,或者改成更简洁的名字,用shell命令批量处理:# 把所有.cpp.o改成.o(例如firstobjectfile.cpp.o → firstobjectfile.o) for file in *.cpp.o; do mv "$file" "${file%.cpp.o}.o"; done # 或者自定义命名,比如统一前缀mylib_ # for i in *.cpp.o; do mv "$i" "mylib_${i%.cpp.o}.o"; done - 重新创建静态库:
用ar rcs命令生成新的归档文件(rcs参数表示替换创建并更新符号表):ar rcs libmylib_DARWIN_new.a *.o # 处理Linux版本同理 ar rcs libmylib_LINUX_new.a *.o - 清理临时文件:
rm *.o
另外,更高效的方式是编译阶段直接指定目标文件名,这样归档后就不用事后修改了:
clang -c firstobjectfile.cpp -o mylib_obj1.o clang -c secondeobjectfile.cpp -o mylib_obj2.o # 然后归档 ar rcs libmylib_DARWIN.a mylib_obj1.o mylib_obj2.o
内容的提问来源于stack exchange,提问作者Anton Menshov
相关产品推荐
相关产品推荐

