LINUX.ORG.RU

Статическая сборка программ


0

0

Привет всем!

Поставил себе QT и собрал Hello world. Вот интересный результат:

ldd ./qt
        libQtGui_debug.so.4 => /usr/local/Trolltech/Qt-4.0.0/lib/libQtGui_debug.so.4 (0x003ee000)
        libpng12.so.0 => /usr/lib/libpng12.so.0 (0x00111000)
        libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0x003c6000)
        libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0x00db7000)
        libXi.so.6 => /usr/X11R6/lib/libXi.so.6 (0x00c4f000)
        libXrender.so.1 => /usr/X11R6/lib/libXrender.so.1 (0x00cf1000)
        libXrandr.so.2 => /usr/X11R6/lib/libXrandr.so.2 (0x00134000)
        libXcursor.so.1 => /usr/X11R6/lib/libXcursor.so.1 (0x00138000)
        libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00aa3000)
        libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x00f2d000)
        libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x00141000)
        libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x00191000)
        libQtCore_debug.so.4 => /usr/local/Trolltech/Qt-4.0.0/lib/libQtCore_debug.so.4 (0x00270000)
        libz.so.1 => /usr/lib/libz.so.1 (0x0014f000)
        libdl.so.2 => /lib/libdl.so.2 (0x00c9d000)
        libpthread.so.0 => /lib/tls/libpthread.so.0 (0x0015d000)
        libstdc++.so.6 => /usr/local/lib/gcc/i686-pc-linux-gnu/4.0.0/libstdc++.so.6 (0x00957000)
        libm.so.6 => /lib/tls/libm.so.6 (0x00f79000)
        libgcc_s.so.1 => /usr/local/lib/gcc/i686-pc-linux-gnu/4.0.0/libgcc_s.so.1 (0x0016d000)
        libc.so.6 => /lib/tls/libc.so.6 (0x00af3000)
        libexpat.so.0 => /usr/lib/libexpat.so.0 (0x003ce000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x0017b000)


Короче полный писец!

Как в общем случае собрать программу статически, от чего зависит 
возможность статической сборки.
На уровне чего это определяется.

Короче, что нужно почитать, чтобы полностью разобраться с вопросом.

Спасибо!

И что Вас напрягает?

anonymous
()
Ответ на: комментарий от Die-Hard

Прочитав это я понял, что всё ОЧЕНЬ плохо с портабельностью и 
работой в разных дистрибутивах!

http://www.codecomments.com/archive286-2004-4-181017.html

http://groups.google.com/group/comp.os.linux.development.apps/browse_frm/thread/
3cb7d8fbf9d82d7b/d3afa6f3050d8ba8#d3afa6f3050d8ba8

Универсального решения нет! Только система подпорок, которые работают
лишь в определённых случаях.

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

Никто не просит таскать бинари между дистрибутивами.

А таскаешь - таскай вместе с динамическими библиотеками, никто не мешает.

anonymous
()
Ответ на: комментарий от anonymous

Допустим ситуацию:
Я разработчик софта (КОММЕРЧЕСКОГО) и продаю свою программу за
немалые деньги.

Мне не хочется гемороиться и делать сложные установщики, которые 
бы играли с LD_LIBRARY_PATH и библиотеками с моего сервера
разработки. Причём установщики эти в общем случае разные и зависят
от дистрибутива.
Ну зачем мне тратить на это время, если его можно потратить на
улучшение (и увеличение стоимости) продукта!

Вот поэтому и хочется один раз взять и поставить весь софт на
сервер разработки, собрать проект статически и получить бинарник
(пусть хоть в 100Мб), который можно было бы запускать на ЛЮБОЙ
линуксе.

По себе скажу - заставлять пользователя (не особо продвинутого)
качать и ставить 15-20 библиотек не хочется.

Это конечно мечта, но всё же...

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

2Krivenok_Dmitry (10.01.2006 15:58:53):

> Универсального решения нет! Только система подпорок, которые работают лишь в определённых случаях.

Ну, я девелоплю некую систему, и пока не сталкивался с I32 ELF Линуксами, на которых моя система (несколько статически слинкованных прог) не работала бы. Вернее, иногда сталкиваюсь и сразу подправляю.

Одна проблема -- с nsswitch -- решается "перепропиской" переменной DISPLAY в стартовых скриптах с символического имени на IP.

Но проблема, действительно, трудноразрешимая.

Die-Hard ★★★★★
()
Ответ на: комментарий от Krivenok_Dmitry

В чём проблема? Дописываешь к флагам компилятора -Wl,--all-static и всё

Spectrum
()
Ответ на: комментарий от Krivenok_Dmitry

Это же Linux :) В общем случае ни о какой портабельности между дистрибами речи быть не может. Некоторые библиотеки просто нельзя залинковать статически (тот же libpthread.so и libdl.so).

Кроме того, как ты можешь заметить, в путях много X-овых библиотек. Поскольку они являются "системными", то, пожалуй, линковать их статически тоже в принципе было бы опасно.

Саму QT library вроде бы можно собрать как архив .a.

jek_
()

>Как в общем случае собрать программу статически, 
man gcc
man ld


>от чего зависит возможность статической сборки.
от наличия статических либ


>На уровне чего это определяется.
в твоём случае от самой Qt

cvv ★★★★★
()
Ответ на: комментарий от Krivenok_Dmitry

Если для тебя скрипт для запуска с LD_LIBRARY_PATH - сложен, то твоя софтина и подавно никому не нужна, ничего ценного ты не напишешь.

А вот за статическую линковку GPL и LGPL библиотек в коммерческую закрытую дрянь тебе хайло быстро начистят, и правильно сделают.

anonymous
()
Ответ на: комментарий от anonymous

>Если для тебя скрипт для запуска с LD_LIBRARY_PATH - сложен, то твоя софтина и подавно никому не нужна, ничего ценного ты не напишешь.

Сразу видно что ты никогда не писал инсталляторы.

Если и есть люди которым доставляет удовольствие выкачивать по 20
библиотек, собирать их (иногда правя код или скрипты configure т.к.
хрен с первого раза соберётся), а потом содержать по 5 веток этих
либ, чтобы ВСЕ (а не одна) программы работали, то слава богу, что
у них есть до х@я свободного времени.

Я лично, как один раз день убил на сборку какого-то дерьма, которое
потащило за собой gtk, gdk, libfreetype, pango, libxrender и ещё 
кучу всего понял, что это большая проблема.

Не сомниваюсь, что если мне нужно собрать программу, то я это всё-равно
сделаю, но за кокое время - вот в чём вопрос!!!

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

Писал, неоднократно.

Ты не понял - тащишь с собой все ДИНАМИЧЕСКИЕ бинарники. Очень просто.

Смотри, как игрушки от Loki сделаны, например. Юзеру ни о каких библиотеках думать не полагается. Так что - не тупи.

anonymous
()
Ответ на: комментарий от anonymous

> за статическую линковку GPL и LGPL библиотек в коммерческую закрытую дрянь тебе хайло быстро начистят

За динамическую тоже, кстати.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от watashiwa_daredeska

за динамическую линковку LGPL не начистят :)

Reset ★★★★★
()

Да.. с линковкой дело тухлое. В своё время тоже с эти мучился. плюнул на это дело.

RRD
()
Ответ на: комментарий от Krivenok_Dmitry

> Прочитав это я понял, что всё ОЧЕНЬ плохо с портабельностью и работой в разных дистрибутивах!

Да, проблемы есть.

Однако, что мешает носить с собой все нужные динамические библиотеки, и считать их частью дистрибутива твоего продукта?

Чем это хуже [противоречащей закону для lgpl'ных библиотек, коих большинство] статической линковки?

Такое впечатление, что автор топика подразумевает тождество между отсутствием зависимости от внешних библиотек и гарантией работоспособности.

anonymous
()
Ответ на: комментарий от Krivenok_Dmitry

> Это конечно мечта, но всё же...

.iso, на котором лежит ядро, твоя чудо-программа и все нужные ей библиотеки. Иначе - только в исходниках.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.