Статическая ссылка libstdc++ с помощью clang

когда я использую GCC, я могу построить программу на своем Ubuntu 15.04, используя это:

-static-libgcc -static-libstdc++

и скомпилированный двоичный файл может работать на" складе " Ubuntu 14.04 без каких-либо внешних пакетов, только стандартные обновления.

есть ли возможность построить с помощью этой статической ссылки на библиотеку с лязгом?

наиболее распространенные ответы:

  • использование теста ubuntu rep (ppa:ubuntu-toolchain-r/test)
  • обновление сервера
  • перекомпиляция по воротам сервер
  • не используйте GCC

не подходит для меня.

просто могу ли я сделать это с помощью clang для запуска на Ubuntu 14.04.3 LTS?

1 ответов


clang совместим с gcc по этому вопросу. В основном для программы hello-world, которая использует iostream для обеспечения libstdc++ требование (фактические версии lib могут отличаться между дистрибутивами):

$ 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)

вот зависимость для libstdc++ и libgcc_s. Но если добавить -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)

это все еще оставляет зависимость от libc, но это другой вопрос.

clang: warning: argument unused during compilation: '-static-libstdc++' означает, что clang проигнорировал этот флаг, потому что флаг бесполезен в текущем ситуация. Первые два примера, которые приходят на ум, - это компиляция кода C (который, очевидно, не зависит от libstdc++) или выдача команды только для компиляции без ссылки (-c флаг). С .o файл не может содержать информацию о статической или динамической компоновке, этот флаг должен быть указан на этапе компоновки (и, чтобы избежать предупреждения,только на стадии компоновки).