Static link libstdc++ using clang

前端 未结 2 1295
离开以前
离开以前 2020-12-31 07:38

When I use GCC, I can build program on my Ubuntu 15.04 using this:

-static-libgcc -static-libstdc++

And compiled binary can run on \"stock\

相关标签:
2条回答
  • 2020-12-31 08:07

    clang is compatible with gcc on this matter. Basically for hello-world program that uses iostream to ensure libstdc++ requirement (actual lib versions may vary between distributions):

    $ clang++ test.cpp
    $ ldd ./a.out
            linux-vdso.so.1 (0x00007ffec65c0000)
            libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/libstdc++.so.6 (0x00007ff937bb6000)
            libm.so.6 => /lib64/libm.so.6 (0x00007ff9378b6000)
            libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/libgcc_s.so.1 (0x00007ff93769e000)
            libc.so.6 => /lib64/libc.so.6 (0x00007ff9372fe000)
            /lib64/ld-linux-x86-64.so.2 (0x00007ff937f3e000)
    

    Here is a dependency for libstdc++ and libgcc_s. But if you add -static-libgcc -static-libstdc++:

    $ clang++ test.cpp -static-libgcc -static-libstdc++
    $ ldd ./a.out
            linux-vdso.so.1 (0x00007ffe5d678000)
            libm.so.6 => /lib64/libm.so.6 (0x00007fb8e4516000)
            libc.so.6 => /lib64/libc.so.6 (0x00007fb8e4176000)
            /lib64/ld-linux-x86-64.so.2 (0x00007fb8e4816000)
    

    That still leaves dependency on libc, but that is a different question.

    clang: warning: argument unused during compilation: '-static-libstdc++' means clang ignored this flag, because flag is useless in current situation. First two examples that coming to mind is compiling C code (which obviously don't depend on libstdc++), or issuing compile-only command without linking (-c flag). Since .o file cannot hold information about static or dynamic linking, this flag have to be specified on linking phase (and, to avoid warning, only on linking phase).

    0 讨论(0)
  • 2020-12-31 08:20

    Instead of using -static-libstdc++ or -static-libgcc, just use clang's -static flag. It will produce a non dynamic executable, with everything it needs linked in statically.

    On my test program, it produces:

    [root@interserver ogrerobot.com]# ldd ./CppUtilsSpikes  
    not a dynamic executable
    
    0 讨论(0)
提交回复
热议问题