The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Связывание со статическими библиотеками, !*! Den, 05-Дек-08, 14:10  [смотреть все]
Есть необходимость скомпилировать файлик, причем библиотеки должны линковаться к нему статически.
Пишу:
$ gcc -c a.c
$ gcc -static a.o -o aaa
В ответ компилятор сообщает об обшибке:
$ gcc -static a.o -o aaa
/usr/bin/ld: cannot find -lc
collect2: выполнение ld завершилось с кодом возврата 1
Видно, что он не может найти статическую библиотеку libc.a
Поискал ее у себя на компе, действительно нет. Динамическая есть - libc.so.
Вопрос: можно ли из динамической библиотеки сделать статическую? Если нет, то как можно выйти из этой ситуации? Копирование с других компов этой библиотеки не помогло.
ОС - Mandriva Linux 2008, gcc - 4.2.2
  • Связывание со статическими библиотеками, !*! Den, 14:23 , 05-Дек-08 (1)
    Может следует взять исходники и пересобрать статически?

    • Связывание со статическими библиотеками, !*! vic, 14:59 , 05-Дек-08 (2)
      >Может следует взять исходники и пересобрать статически?

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

      зы установите glibc-devel и появится libc.a

      • Связывание со статическими библиотеками, !*! Den, 16:49 , 05-Дек-08 (3)
        glibs-devel уже стоит.
        Смысл в чем. Собственно, эта проблема наверно достойна отдельной темы. Есть некий комп, на котором собранные на моем компьютере исполняемые файлы не исполняются. Появляется ошибка floating point exception, хотя на моем конечно все работает и дело не в коде. Я попробовал собрать на своем статически, чисто ради эксперимента, и натолкнулся, что не получается у меня это сделать. На компе (там довольно древнее ПО), на котором не работали мои исполняемые файлы проблему я поборол, может не совсем красивым способом, просто заменив 2 библиотеки (libc и ld-linux), разобравшись что программа "падает" именно в их коде, что тоже очень странно, на свои (имеется в виду со своего компьютера), и файлы начали запускаться.
        • Связывание со статическими библиотеками, !*! vic, 17:25 , 05-Дек-08 (4)
          >glibs-devel уже стоит.

          glibc-devel (через с, а не s), странно тогда, проверьте список файлов этого пакета, среди них должен быть libc.a, если нет поищите среди пакетов с "glibc" в названии, т.к. это либа из глибсы.

          >Смысл в чем. Собственно, эта проблема наверно достойна отдельной темы. Есть некий
          >комп, на котором собранные на моем компьютере исполняемые файлы не исполняются.
          >Появляется ошибка floating point exception, хотя на моем конечно все работает
          >и дело не в коде. Я попробовал собрать на своем статически,
          >чисто ради эксперимента, и натолкнулся, что не получается у меня это
          >сделать. На компе (там довольно древнее ПО), на котором не работали
          >мои исполняемые файлы проблему я поборол, может не совсем красивым способом,
          >просто заменив 2 библиотеки (libc и ld-linux), разобравшись что программа "падает"
          >именно в их коде, что тоже очень странно, на свои (имеется
          >в виду со своего компьютера), и файлы начали запускаться.

          Подход не правильный изначально.
          Нельзя просто так взять перенести бинарь запустить его и радоваться. Такое возможно когда у вас на двух хостах идентичные конфигурации софта и ключи компиляции по архитектуре совместимые. Что используется например для варианта build-хоста имеющего такую же конфигурацию и версии всех компонентов что и production-хост. На нем обычно собирается бинарный пакет и и далее устанавливается на production (rpm-based distributives тому пример).
          Если же как в вашем случае хосты имеют разную конфигурацию по версиям ПО, их параметрам, на второй машине видимо архитектура более старая, отличная от той где вы собираете бинарь,
          это приводит в различиях в ABI и т.п., о чем и говорят проблемы с ld-linux и libc, как следствие странные ошибки. То что вы сделали просто заменив их (как понимаю просто обе .so скопировали), не решение, т.к. вы может быть на первый взгляд и решили проблему, а на самом деле создали ситуацию когда в дальнейшем полезут странные и неотлавливамые ошибки в самых неожиданных местах и в вашей программе и в других процессах системы.

          По хорошему следует либо ключами компилятора задавать более архитектурно безопасный вариант компиляции (если разница в ПО незначительно и есть backward compability между этими версиями), либо, что еще лучше, компилировать и собирать прямо на целевой машине (если нет build хоста с идентичной конфигурацией).

          Статическая сборка не решит всех проблем в данном случае - просто ошибки будут иные, в другом месте и еще более непонятные.

          • Связывание со статическими библиотеками, !*! phpcoder, 20:18 , 05-Дек-08 (5)
            >>glibs-devel уже стоит.
            >
            >glibc-devel (через с, а не s), странно тогда, проверьте список файлов этого
            >пакета, среди них должен быть libc.a, если нет поищите среди пакетов
            >с "glibc" в названии, т.к. это либа из глибсы.

            Часто в rpm-based дистрибутивах пакет называется glibc-devel-static. (А в Debian/Ubuntu, так и вовсе не -devel, а -dev)




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру