C++ 从静态库中剥离/删除调试符号和存档名称

C++ 从静态库中剥离/删除调试符号和存档名称,c++,static-libraries,debug-symbols,otool,C++,Static Libraries,Debug Symbols,Otool,我有一个静态库(C++)(比如说,libmylib_DARWIN.a和libmylib_LINUX.a,用于两种体系结构)在我的Mac上使用clang编译(Apple LLVM 9.0.0版(clang-900.0.39.2) 现在,有两个问题: 静态库(使用当前生成配置)包含调试符号 它还显示用于存档的对象文件的名称 otool-Iv libmylib_DARWIN.a Archive:libmylib_DARWIN.a libmylib_DARWIN.a(firstobjectfile.cp

我有一个静态库(C++)(比如说,
libmylib_DARWIN.a
libmylib_LINUX.a
,用于两种体系结构)在我的Mac上使用clang编译(
Apple LLVM 9.0.0版(clang-900.0.39.2)

现在,有两个问题:

  • 静态库(使用当前生成配置)包含调试符号
  • 它还显示用于存档的对象文件的名称

    otool-Iv libmylib_DARWIN.a

    Archive:libmylib_DARWIN.a
    libmylib_DARWIN.a(firstobjectfile.cpp.o)
    libmylib_DARWIN.a(secondobjectfile.cpp.o)
    ..

  • 我想从这个库中删除调试符号和存档文件名。我想知道是否有一种方便的方法可以在不改变构建配置的情况下进行

    • Mac上的
      strip
      会为达尔文和LINUX构建的库都这样做吗?还有什么我应该注意的吗
    • strip
      似乎不会删除存档文件名

    在这方面也有一些类似的问题;但是,我发现的那些涉及iOS、Objective C、不谈论多平台、也不提及归档名称。

    这个脚本实现了Sigismondo的建议(解压归档文件,单独剥离每个对象文件,重命名它们
    1000.o
    1001.o
    ,等等,然后重新打包)。
    ar CRU
    的参数可能因您的
    ar
    版本而异

    #!/bin/bash
    # usage: repack.sh file.a
    
    if [ -z "$1" ]; then
        echo "usage: repack file.a"
        exit 1
    fi
    
    if [ -d tmprepack ]; then
        /bin/rm -rf tmprepack
    fi
    
    mkdir tmprepack
    cp $1 tmprepack
    pushd tmprepack
    
    basename=${1##*/}
    
    ar xv $basename
    /bin/rm -f $basename
    i=1000
    for p in *.o ; do
        strip -d $p
        mv $p ${i}.o
        ((i++))
    done
    
    ar crus $basename *.o
    mv $basename ..
    
    popd
    /bin/rm -rf tmprepack
    exit 0
    

    只是咖喱;“我想删除这两个…”-为什么?调试符号和文件名都披露了我在法律上不应该共享的信息。对于文件名,技术上可以通过重命名来解决(这非常不方便),我想从我的家庭操作系统中去除多个体系结构的调试符号-这也是一种方便。使用
    ar
    提取原始.o文件,分别对其运行
    strip
    ,重命名,使用
    ar
    ld
    重新打包。感谢您的实施。这个脚本肯定会删除调试符号并更改文件名,但现在我无法像以前那样链接到它。未定义符号-由于引用现在未定义…很抱歉,请尝试将strip行更改为
    strip-d$p
    以仅剥离调试符号。该脚本在Mac上用于Mac版本的库。然而,它拒绝在LINUX上工作。然而,它也适用于LINUX for LINUX库。这解决了90%的问题。如果没有更好的办法,我就接受。谢谢谢谢你的剧本!我在macOS上唯一需要做的补充就是只剥离.o文件(
    如果[[$p==*.o]];那么
    ),并使用“-S”标志(-d表示其他内容):
    剥离-S$p