Руководство по Командной Строке



Pdf просмотр
страница9/12
Дата26.11.2016
Размер1.9 Mb.
Просмотров2864
Скачиваний0
1   ...   4   5   6   7   8   9   10   11   12
(object code) (или бинарный код
(binary code)). В конце этого шага генерируются файлы с расширением .o.
4. ld : На последней стадии происходит линковка (linkage) всех объектных файлов (.o) и необходимых библиотек
, и, в результате получается выполняемый файл.
12.1.3. Структура распространения программ
Правильно сформированный набор исходных кодов программы обязательно имеет следующую организацию
:

В файле INSTALL описана процедура инсталляции

В файле README содержится общая информация
, относящаяся к программе (короткое описание, автор,
URL где можно найти эту программу, документы имеющие отношение к программе, относящиеся к делу ссылки
, и т.д.). В случае отсутствия файла INSTALL в файле README должна находиться краткая информация по инсталляции

В файле COPYING должна содержаться лицензия или условия распространения программы
. В некоторых случаях для этих целей используется файл LICENSE
, который имеет тоже самое содержимое.

В файле CONTRIB или в файле CREDITS содержится список людей
, имеющих отношение к этому программному продукту
(активные участники, их вклад в продукт и т.д.).

Файл CHANGES
(реже NEWS), содержит последние изменения и устраненные ошибки.

Файл Makefile
(смотри раздел Разд. 12.4.1) позволяет произвести компиляцию программного обеспечения
(этот файл необходим для утилиты make). Этого файла часто может не существовать сразу,
тогда он создается динамически в процессе настройки

Весьма часто файлы configure или Imakefile позволяют сгенерировать новый файл Makefile
66

Глава
12. Сборка и инсталляция свободного програмного обеспечения

Каталог
, в котором содержатся исходные коды, и где после компиляции будут лежать бинарники обычно называется src

Каталог
, в котором содержится документация, относящаяся к этому программному продукту (обычно в форматах man или Texinfo
) называется doc.

Иногда может поставляться каталог
, в котором содержатся специфические для программы данные
(обычно это файлы настройки, примеры получаемых данных или файлы ресурсов).
12.2.
Распаковка
12.2.1. Архив tar.gz
Стандартным
4
форматом сжатия для систем UNIX является формат программы gzip
, разработанный в рамках проекта
GNU и соединяющий в себе все лучшее из основных утилит компрессии.
Утилита gzip неразрывно связана с утилитой tar
. tar это старая программа, оставшаяся в живых с тех времен
, когда компьютерщики сохраняли свои данные на магнитных лентах. В настоящее время дискеты и
CD-ROM вытеснили магнитные ленты, но утилита tar все еще используется для создания архивов. Все файлы и каталоги могут быть слеплены в один файл и после этого легко сжаты с помощью утилиты gzip
Это является причиной
, по которой свободное программное обеспечение обычно доступно в виде архива tar
, сжатого с помощью программы gzip. Поэтому расширение файла выглядит так: .tar.gz (иногда для краткости .tgz
).
12.2.2. Использование GNU Tar
Для распаковки этого архива могут быть использованы gzip и tar
. Но GNU версия программы tar
(gtar) позволяет использовать gzip на лету” (on-the-fly) , и распаковать и разархивировать файлы из архива одним действием
(кстати, это экономит дополнительное место на диске по причине отсутствия промежуточного файла архива
).
Формат использования tar выглядит так
:
tar <.tar.gz file> [files]
Опция необязательна
. Если она опущена, то действие будет применено ко всему архиву. Этот аргумент не нужен для извлечения содержимого архива .tar.gz
Для примера
:
$ tar xvfz guile-1.3.tar.gz
-rw-r--r-- 442/1002 10555 1998-10-20 07:31 guile-1.3/Makefile.in
-rw-rw-rw- 442/1002 6668 1998-10-20 06:59 guile-1.3/README
-rw-rw-rw- 442/1002 2283 1998-02-01 22:05 guile-1.3/AUTHORS
-rw-rw-rw- 442/1002 17989 1997-05-27 00:36 guile-1.3/COPYING
-rw-rw-rw- 442/1002 28545 1998-10-20 07:05 guile-1.3/ChangeLog
-rw-rw-rw- 442/1002 9364 1997-10-25 08:34 guile-1.3/INSTALL
-rw-rw-rw- 442/1002 1223 1998-10-20 06:34 guile-1.3/Makefile.am
-rw-rw-rw- 442/1002 98432 1998-10-20 07:30 guile-1.3/NEWS
-rw-rw-rw- 442/1002 1388 1998-10-20 06:19 guile-1.3/THANKS
-rw-rw-rw- 442/1002 1151 1998-08-16 21:45 guile-1.3/TODO
Некоторые опции tar
:

v verbose. В этом случае имена всех файло, найденных в архиве, будут показаны на экране. Если эта опция опущена
, процесс будет происходить без вывода какой-либо информации на экран.

f Это обязательная опция
. Без нее tar будет использовать вместо архива стример (то есть устройство
/dev/rmt0
).
4.
Все чаще и чаще в новых программах начинают использовать bzip2
- более эффективный компрессор для текстовых файлов
(и требующий больших мощностей от компьютера). Смотрите раздел Разд. 12.2.3, где описаны особенности этой программы
67

Глава
12. Сборка и инсталляция свободного програмного обеспечения

z эту опцию нужно применять к архиву
, сжатому gzip (у которых расширение .gz). Если упустить эту опцию
, tar сгенерирует ошибку. И наоборот - эта опция не может быть использована с несжатыми архивами
Программа tar позволяет производить разные действия с архивом
(извлекать, читать, создавать,
добавлять
...). Для этих действий применяются следующие опции:

x
: позволяет извлечь файлы из архива.

t
: получить список содержимого архива.

c
: позволяет создать новый архив. Между прочим, вы можете использовать это для создания резервных копий ваших личных файлов

r
: позволяет вам добавить файлы в конец архива. Этого нельзя делать в сжатых архивах.
12.2.3. bzip2
Формат сжатия bzip2 был разработан для замены gzip
. bzip2 делает архивы меньшего размера, чем gzip,
но это еще пока не стандарт
. Совсем недавно стали попадаться архивы с расширением .tar.bz2.
bzip2 используется также
, как gzip посредством вызова команды tar. Разве что нужно заменить опцию z на j
. Например:
$ tar xvjf foo.tar.bz2
В некоторых дистрибутивах программ вместо этого могут предлагать использовать опцию I
:
$ tar xvfI foo.tar.bz2
Это же можно записать и длинным способом
:
$ tar --use-compress-program=bzip2 -xvf foo.tar.bz2
Перед тем как использовать tar
, вы должны убедится, что программа bzip2 установлена в каталог,
который содержится в переменной окружения PATH
12.2.4. Просто сделайте это!
12.2.4.1. Самый простой способ
Теперь
, когда вы готовы к распаковке архива, не забудьте получить права root. Вам прийдется делать вещи
, которые обычному пользователю делать не положено. Некоторые этапы все же можно делать не имея привилегированных прав
, но проще сразу перейти в root на весь процесс установки программы.
Во
-первых, зайдите в каталог /usr/local/src и скопируйте туда архив. Вы всегда сможете найти тут архив в случае потери программного обеспечения
. Если у вас мало места на жестком диске, после компиляции сохраните исходные коды на дискетах
. Вы также можете впоследствии просто удалить исходники
, если вы уверены, что всегда сможете получить их в Web .
Правильно отработавшая программа tar
, развернув архив, должна создать новый каталог. Зайдите в него.
Теперь мы можем продолжить
12.2.4.2. Самый безопасный путь
UNIX
-подобные системы (такие как GNU/Linux и FreeBSD ) являются безопасными системами. Это значит,
что обычные пользователи не могут произвести действия
, угрожающие работоспособности системы
(например, отформатировать диск). Также обычный пользователь не имеет доступа к файлам других пользователей
. Кстати, это придает системе иммунитет от вирусов.
С другой стороны
, root может делать все. Наличие исходных кодов делает возможным проверку программы на наличие злонамеренного кода
(вирусы и трояны). Проявите бдительность
5 5.
В мире
BSD существует пословица: “Никогда не доверяйте пакету, к которому у вас нет исходных кодов (Never trust a package you don’t have the sources for).”
68

Глава
12. Сборка и инсталляция свободного програмного обеспечения
Идея состоит в том
, чтобы создать пользователя специально для администрирования (например free или admin
) путем использования командочки adduser. Этот пользователь должен иметь права на запись в следующих каталогах
: /usr/local/src, /usr/local/bin и /usr/local/lib, а также все подкаталоги в
/usr/share/man
. Мы рекомендуем сделать этого пользователя владельцем этих каталогов или создать группу для него и разрешить этим каталогам запись для этой группы
Как только все эти предосторожности приняты
, вы можете следовать указаниям в разделе Разд. 12.2.4.1.
12.3.
Конфигурирование
Большой технический интерес представляет тот факт
, что авторы, создавая исходные коды, делают их портируемыми
. Свободное программное обеспечение, разработанное для систем UNIX , может быть использовано во всех существующих системах UNIX
(свободных или коммерческих) с минимальными изменениями
. Для этого необходим процесс конфигурирования перед компиляцией.
Существует несколько систем конфигурирования
. Вы должны использовать ту, которую хочет автор программного обеспечения
( иногда необходимо несколько). Обычно вы можете:

Использовать AutoConf
(см. раздел Разд. 12.3.1), если в поставке существует файл с названием configure

Использовать imake
(см раздел Разд. 12.3.2), если в поставке существует файл с названием Imakefile.

Выполнить скрипт
(например install.sh) согласно инструкциям, содержащимся в файлах INSTALL или
README
12.3.1. AutoConf
12.3.1.1. Принципы
Программа AutoConf используется для правильной настройки программного обеспечения
. Она создает файлы
, необходимые для компиляции (такие как Makefile) и кое что изменяет прямо в исходных кодах
(например config.h.in).
Принципы работы AutoConf просты
:

Программист
, разрабатывающий данную программу, знает какие проверки необходимо сделать для настройки этой программы
(например: “какая версия библиотеки у вас установлена?”). Программист записывает эти проверки
(в специальном формате) в файл с именем configure.in.

После этого программист запускает программу AutoConf
, которая из файла configure.in создает конфигурационный скрипт с названием configure
. Этот скрипт делает все необходимые проверки, какие запланировал программист

Конечный пользователь запускает этот скрипт и AutoConf настраивает все что нужно для компиляции
12.3.1.2. Пример
Пример использования AutoConf
:
$ ./configure loading cache ./config.cache checking for gcc... gcc checking whether the C compiler (gcc
) works... yes checking whether the C compiler (gcc
) is a cross-compiler... no checking whether we are using GNU C... yes checking whether gcc accepts -g... yes checking for main in -lX11... yes checking for main in -lXpm... yes checking for main in -lguile... yes checking for main in -lm... yes checking for main in -lncurses... yes checking how to run the C preprocessor... gcc -E
69

Глава
12. Сборка и инсталляция свободного програмного обеспечения checking for X... libraries /usr/X11R6/lib, headers /usr/X11R6/include checking for ANSI C header files... yes checking for unistd.h... yes checking for working const... yes updating cache ./config.cache creating ./config.status creating lib/Makefile creating src/Makefile creating Makefile
Есть возможность внести кое
-какие изменения в работу скрипта configure путем внесения некоторых опций в командную строку скрипта или в переменные окружения
. Пример:
$ ./configure --with-gcc --prefix=/opt/GNU
или
(при помощи bash ):
$ export CC=‘which gcc‘
$ export CFLAGS=-O2
$ ./configure --with-gcc или так
:
$ CC=gcc CFLAGS=-O2 ./configure
12.3.1.3. А что если... это не работает?
Обычно это ошибка такого типа
: configure: error: Cannot find library guile (большинство ошибок конфигурации
, выдаваемые configure напоминают эту).
Это обозначает
, что скрипт configure не смог найти библиотеку (в данном примере это библиотека guile).
Принцип проверки заключается в том
, что скрипт configure для проверки компилирует маленькую программу
, которая использует искомую библиотеку. Если компиляция этой тестовой программы не завершилась успешно
, то ошибка произойдет и при компиляции нашего программного обеспечения.

Причину ошибки можно найти в конце файла config.log
, в котором содержится журнал всех действий,
предпринятых при настройке
. Компилятор C обычно выдает довольно понятные сообщения об ошибках.
Этот факт должен помочь вам в решении проблемы

Производится проверка того
, что нужная библиотека установлена надлежащим образом. Если она не установлена
, то ее необходимо установить (из исходников или бинарников) и запустить configure повторно
. Эффективным способом проверки является поиск файлов, содержащихся в библиотеке
; это практически всегда lib.so. Например так:
$ find / -name ’libguile*’
или вот так
(в этом случае поиск проходит быстрее):
$ locate libguile

Проверить
, доступна ли библиотека для вашего компилятора. То есть библиотека должна находиться в каталогах
: /usr/lib , /lib , /usr/X11R6/lib (или в других каталогах, список которых содержится в переменной окружения LD_LIBRARY_PATH
, которые описываются в Разд. 12.4.5 номер 5.b. Проверьте,
является ли этот файл библиотекой
. Для этого выполните команду file libguile.so.

Проверьте
, что заголовочные файлы библиотеки (хедеры, headers) установлены в правильном месте
(обычно /usr/include или /usr/local/include или /usr/X11R6/include). Если вы не знаете, какой из хедеров вам нужен
, проверьте что установлена версия для разработки (development) данной библиотеки
(например для libgtk+2.0 должен быть установлен пакет libgtk+2.0-devel). Версия пакета библиотек для разработки содержит в себе файлы
“include”, которые необходимы для компиляции программ,
использующих эту библиотеку

Проверьте наличие свободного места на диске
(скрипт configure требует некоторого количества свободного места на диске для размещения временных файлов
). Используйте команду df -h для отображения разделов вашего диска и степени их заполнения
Если для вас непонятны сообщения
, находящиеся в файле config.log , не стесняйтесь спрашивать помощи у сообщества свободного программного обеспечения
(см. раздел Разд. 12.6.2).
70

Глава
12. Сборка и инсталляция свободного програмного обеспечения
Кроме того
, проверьте не отвечает ли configure в 100% No и разберитесь, не отвечает ли этот скрипт
No
, когда вы точно знаете, что библиотека установлена. Например, было бы очень странно, если в вашей системе отсутствовала бы библиотека curses
. В этом случае, у вас вероятно неправильно установлена переменная окружения LD_LIBRARY_PATH
!
12.3.2. imake imake позволяет вам производить настройку свободного програмного обеспечения путем создания файла
Makefile по простым правилам
. Эти правила определяют, какие файлы необходимы компилятору для создания бинарного файла и
, пользуясь этими данными, программа imake генерирует соответствующий
Makefile
. Эти правила находятся в файле с названием Imakefile.
Интересно то
, что программа imake использует архитектурно-зависимую информацию (
site ) Это весьма удобно для приложений
, которые используют X Window System . Тем не менее, программа imake используется для многих других приложений
Использовать imake очень просто
. Для этого нужно просто зайти в каталог, в котором находится развернутый архив и выполнить скрипт xmkmf
, который вызовет программу imake :
$ xmkmf -a imake -DUseInstalled -I/usr/X11R6/lib/X11/config make Makefiles
Если site неправильно установлен, перекомпилируйте и установите X11R6 !
12.3.3. Вариант со скриптом shell
Для получения более подробной информации читайте файлы INSTALL или README
. Обычно нужно выполнить файл с названием install.sh или configure.sh
. Инсталляционный скрипт может сам определять все что ему нужно или быть интерактивным и спрашивать у вас разные данные
(например,
путь
).
Если вы не можете определить какой файл вам нужно запустить
, вы можете набрать ./ (находясь в bash )
и нажать дважды кнопочку
TAB
(клавиша горизонтальной табуляции). bash автоматически найдет в текущем каталоге все файлы
, которые можно выполнить (в том числе и выполняемые скрипты). Если существует несколько файлов
, которые можно выполнить, вы получите список таких файлов и вам останется только выбрать нужный
В особых случаях нужно установить модули perl
. Установка таких модулей выполняется путем выполнения скрипта
, написанного на perl . Стандартная команда для выполнения такого скрипта выглядит так
:
$ perl Makefile.PL
12.3.4. Другие варианты
Некоторые дистрибутивы свободного программного обеспечения на первых стадиях развития имеют ужасную организацию
(мы вас предупреждаем!). Они требуют внесения изменений “ручками” в некоторые конфигурационные файлы
. Обычно это файлы Makefile (см. раздел Разд. 12.4.1) и config.h (эти названия чаще встречаются
. но могут быть и другие).
Мы не советуем делать таких манипуляций
, если (конечно) вы не понимаете, что вы делаете. Эти действия требуют некоторых знаний
, опыта и желания, но не забывайте пословицу : “practice makes perfect”
(практика делает совершенным).
12.4.
Компиляция
Теперь
, когда программное обеспечение правильно сконфигурировано, остается только его откомпилировать.
Этот этап прост и не должен вызывать каких либо серьезных проблем
71

Глава
12. Сборка и инсталляция свободного програмного обеспечения
12.4.1. make
Общество свободного программного обеспечения считает утилиту make излюбленным инструментом для компиляции исходных кодов
. Это дает следующие преимущества:

Разработчик экономит время
, потому что у него есть возможность эффективно управлять процессом компиляции своего проекта

Конечный пользователь может откомпилировать и установить программное обеспечения
, введя всего несколько командных строк
, даже в том случае, если он ничего не понимает в программировании.
Действия
, которые необходимо выполнить для получения откомпилированной версии исходных кодов,
обычно хранятся в файле с названием Makefile или
(реже) в файле GNUMakefile. На самом деле, при вызове команды make читается этот файл из текущего каталога
. Возможно явное указание этого файла для команды make с помощью опции -f
12.4.2. Правила
Программа make действует согласно системным зависимостям
(dependencies), так для компиляции бинарного файла
(“ цели (target) ”) требуется прохождение через несколько стадий (“зависимостей
(dependencies)”). Например, для того чтобы создать (мнимый) бинарный файл glloq, сначала нужно откомпилировать объектные файлы main.o и init.o
(это промежуточные файлы в процессе компиляции),
а потом их нужно слинковать в готовый бинарный файл
. Эти объектные файлы также являются целями,
а зависимостями для них будут файлы исходных текстов
Этот текст является только маленьким введением
, инструкцией по выживанию в сложном мире make. Для того
, чтобы узнать больше, мы советуем вам отправится на сайт APRIL (http://www.april.org/groupes/
doc/
), где размещена более подробная документация о make.
6
Для получения исчерпывающей информации обратитесь ко второму изданию
O’Reilly Managing Projects with Make
Andrew Oram и Steve Talbott.
12.4.3. Поехали!
Обычно при использовании программы make придерживаются некоторых соглашений
. Например, таких как
:

make без аргументов производит просто компиляцию и не выполняет установки программы

make install компилирует программу
(правда не всегда), и инсталлирует необходимые файлы в нужное место в файловой системе
. Некоторые файлы не всегда корректно инсталлируются (man, info),
но их можно скопировать вручную
. Иногда команду make install необходимо запускать несколько раз в подкаталогах
. Обычно это случается с модулями, разработанными третьими лицами.

make clean удаляет все временные файлы
, создающиеся при компиляции, а также, в большинстве случаев
, исполняемые файлы.
На первой стадии необходимо скомпилировать программу
, для этого нужно набрать: (нереальный пример):
$ make gcc -c glloq.c -o glloq.o gcc -c init.c -o init.o gcc -c main.c -o main.o gcc -lgtk -lgdk -lglib -lXext -lX11 -lm glloq.o init.o main.o -o glloq
Замечательно
, допустим что все бинарники правильно откомпилировались. Мы готовы для перехода на следующую стадию
, на которой будут инсталлироваться файлы пакета (бинарные файлы, файлы с данными и т
.д). Смотрите раздел Разд. 12.5.
6.
На русском языке информацию о make можно получить тут
: “Эффективное использование GNU Make” (http:
//doc.lafox.com.ua/unix/make/gmake/gmake.html
) , “Применение GNU make” (http://doc.lafox.com.ua/unix/
make/make/make.html
) , “GNU Automake” (http://doc.lafox.com.ua/unix/make/automake/automake-ru_toc.html)
72

Глава
12. Сборка и инсталляция свободного програмного обеспечения
12.4.4. Объяснения
Если вы достаточно любопытны
, чтобы заглянуть в файл Makefile, то вы найдете там известные команды
(rm, mv, cp, и т.д.) и, кроме того, странные строки вроде этой $(CFLAGS).
Это переменные
, которые обычно расположены в начале файла Makefile и связанные с ними значения.
Это удобно в случае
, когда вам нужно использовать несколько раз одно и тоже значение в нескольких местах
Например
, для того чтобы напечатать строку “ foo ” при выполнении цели make all, можно сделать следующее
:
TEST = foo all:
echo $(TEST)
Обычно определены следующие переменные
:
1. CC: Это компилятор. Обычно это cc, который присутствует в большинстве свободных систем, также это может быть его аналог gcc
. Если у вас возникают сомнения, ставьте gcc.
2. LD: это программа, которая используется на конечной стадии компилирования (см. раздел Разд.
12.1.2.2). По умолчанию это программа ld .
3. CFLAGS: это дополнительные опции компилятору, которые используются компилятором на первой стадии компиляции
. Среди них:

-I
: указывает компилятору где искать дополнительные заголовочные файлы (к примеру: -
I/usr/X11R6/include разрешает компилятору использовать файлы header, расположенные в allows
/usr/X11R6/include
).

-D
: определяет дополнительные символы, которые могут быть необходимы для программ,
компиляция которых зависит от определения таких символов
(к примеру: использовать заголовочный файл string.h в случае
, если определено HAVE_STRING_H).
Строка для компиляции обычно выглядит следующим образом
:
$(CC) $(CFLAGS) -c foo.c -o foo.o
4. LDFLAGS (или LFLAGS): Этот аргумент используется во время конечной стадии компиляции. Среди них:

-L
: Определяет дополнительные пути поиска библиотек (например: -L/usr/X11R6/lib).

-l
: Определяет дополнительные библиотеки, которые будут использоваться в конечном этапе компиляции
12.4.5. А что если... все это не работает?
Не паникуйте
, это может случится с любым. Чаще всего это могут быть следующие ошибки:
1. glloq.c:16: decl.h: No such file or directory
Компилятор не может найти соответствующий заголовочный файл
. Вообще-то эту ошибку должна была предвидеть программа конфигурации
. Но эта проблема решаема:

Проверьте
, действительно ли существует данный файл в следующих каталогах: /usr/include,
/usr/local/include
, /usr/X11R6/include или в каком-нибудь из подкаталогов. Если там нет,
поищите по всему диску
(с помощью утилит find или locate) и, если вы все же не можете найти этот файл
, проверьте, действительно ли вы установили библиотеку, в которую входит этот заголовочный файл
. Примеры использования утилит find и locate вы можете найти в соответствующих страничках руководства
(man find; man locate).

Проверьте
, действительно ли этот файл доступен для чтения (для проверки этого введите less
/.h
)
73

Глава
12. Сборка и инсталляция свободного програмного обеспечения

Если это каталог типа /usr/local/include или /usr/X11R6/include
, вам прийдется добавить новый аргумент компилятору
. Откройте соответствующий Makefile (будьте внимательны: нужный файл находится в каталоге
, в котором произошла ошибка компиляции
7
) в вашем любимом текстовом редакторе
(Emacs , Vi , и т.д.). Перейдите на строку, в которой содержится ошибка, и добавьте строку
-I
- где это путь к каталогу, в котором вы отыскали недостающий заголовочный файл.
Эти опции нужно добавить в конце строки
, в которой вызывается компилятор (gcc, или $(CC)).
Если вы не знаете куда добавить эти опции
, допишите их в конце строк CFLAGS= или
CC=
, которые расположены в начале файла.

Запустите снова make и
, если это опять не работает, перепроверьте снова то, что эти опции (смотрите предыдущий пункт
) действительно были добавлены и получены компилятором.

Если это опять не работает
, обращаетесь за помощью к вашему местному гуру, или к сообществу свободного программного обеспечения
(смотрите раздел Разд. 12.6.2).
2. glloq.c:28: ‘struct foo’ undeclared (first use this function)
Структуры
- это такие специальные формы представления данных, которые используются при написании любых программ
. Многие из них определяются системой в заголовочных файлах. Обычно эта проблема вызвана тем
, что нет какого-то заголовочного файла или он неверен. Правильной процедурой для решения этой проблемы будут следующие действия
:

Попробуйте найти где определяется эта самая структура
(в программе или ее определяет система).
Для этого используется утилита grep
, с помощью которой выясняется определена ли эта структура в каком либо заголовочном файле
Станьте root-ом и выполните следующую команду:
$ find . -name ’*.h’| xargs grep ’struct foo’ | less
В результате может получиться очень много строк
(потому что вы найдете все случаи, когда эта структура используется
). Если структура все-таки существует, найдите заголовочный файл, в котором она определяется
Определение структуры выглядит так
:
struct foo {
<содержимое структуры>
};
Проверьте
, соответствует ли это тому, что имеется у вас. Если да, то это значит, что заголовочный файл не включен в .c файл
, содержащий ошибку. Для устранения этого дефекта есть два способа:

в начало .c файла
, содержащего ошибку, добавьте строку #include ".h".

скопируйте определение этой структуры в начало .c файла
(на самом деле это не очень правильно,
зато обычно помогает
).

Если файл с определением находится в одном из системных каталогов /usr/include
, /usr/X11R6/
include
, или /usr/local/include) , то сделайте тоже самое, только в этом случае вставьте строку такого вида #include <.h>

Если эта структура не находится
, попробуйте выяснить в какой библиотеке (то есть это набор функций
, структур и т.д., содержащихся в отдельном пакете) оно должно содержатся (просмотрите файлы INSTALL или README на предмет того
, какие библиотеки использует данная программа и какие версии библиотек необходимы
). Если требуемые программой версии библиотек не соответствуют тем
, что установлены в вашей системе - вам прийдется установить требуемые версии этих библиотек.

Если все же это не работает
, уточните, может ли работать эта программа в Linux (некоторые программы могут не работать корректно во всех UNIX
). Проверьте также, правильно ли переданы все
7.
Проанализируйте сообщения об ошибках
, выдаваемые программой make. Обычно в последних строках содержится название каталога
, в котором произошла ошибка (сообщение имеет примерно такой вид make[1]:
Leaving directory ‘/home/benj/Project/foo’
). Выберите сообщение с самым маленьким номером. Для проверки того
, что это именно тот каталог, зайдите в него и повторно выполните make. При этом вы должны получить точно такую
-же ошибку.
74

Глава
12. Сборка и инсталляция свободного програмного обеспечения опции команде configure
. Особенно, нет ли каких-то дополнительных опций для вашей конкретной архитектуры
3. Ошибки синтаксического анализа (parse error)
Такие проблемы довольно сложно решать
, так как компилятор может выдать сообщение об ошибке в строке
, которая находится ниже той строки, в которой реально присутствует ошибка. Иногда это просто неопределенный тип данных
. Если вы встречаете сообщение об ошибке такого вида:
main.c:1: parse error before ‘glloq_t main.c:1: warning: data definition has no type or storage class это значит
, что тип данных glloq_t не определен. Для решения этой проблемы нужно предпринять действия
, аналогичные тем, что были описаны для решения предыдущей проблемы.
еще может быть parse error в старых библиотеках curses,
если мне не изменяет память.
4. no space left on device (на диске кончилось место)
Эту проблему легко решить
: недостаточно места на диске для того, чтобы создать бинарник из исходника
. Решение состоит в расчистке места на том разделе, на котором находится каталог инсталляции
(удалите временные файлы или исходники, деинсталлируйте программы, которые вы не используете
). Если вы развернули его в /tmp, а не в /usr/local/src, это зря, потому что он напрасно занимает место на разделе /tmp
. Проверьте, нет ли на диске файлов core>. Если найдутся, удаляйте их или заставьте их удалиться
, если они принадлежат другому пользователю.
5. /usr/bin/ld: cannot open -lglloq: No such file or directory
Это означает
, что программа ld (используемая gcc во время последнего шага компиляции) не может найти библиотеку
. Для того чтобы ее включить, ld ищет файл, чье имя является аргументом типа
-l
. Это файл lib.so. Если ld не находит его, получается ошибка. Для решения проблемы делайте следующее
:
a. Проверьте, есть ли файл на диске с помощью команды locate. Графические библиотеки обычно находятся в /usr/X11R6/lib
. Например:
$ locate libglloq
Если поиск ничего не принес
, вы можете попытаться поискать с помощью команды find command
(то есть: find /usr -name libglloq.so*). Если и это ничего не дало, вам прийдется установить его b. Как только библиотека будет размещена, проверьте ее на доступность для ld: файл /etc/ld.
so.conf определяет
, где искать библиотеки. Добавьте каталог-виновник в его конец (возможно,
вам прийдется перегрузить компьютер
, чтобы изменения вступили в силу). Кроме того, вы можете добавить этот каталог путем изменения содержимого переменной окружения LD_LIBRARY_PATH
Например
, если каталог такой /usr/X11R6/lib, напишите:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/X11R6/lib
(если ваша shell это bash ).
c. Если до сих пор не работает, убедитесь что формат библиотеки это выполняемый файл (или ELF)
командой file
. Если он является символической ссылкой, проверьте что ссылка правильная и не указывает на несуществующий файл
(например, так nm libglloq.so). Права файла тоже могут быть неверными
(если вы используете аккаунт, отличный от root, и если библиотека защищена от чтения
, например).
6. glloq.c(.text+0x34): undefined reference to ‘glloq_init’
75

Глава
12. Сборка и инсталляция свободного програмного обеспечения
Это проблема с символом
, которая не была решена во время последнего шага компиляции. Обычно это проблема библиотеки
. Может возникать по нескольким причинам:

первое
, что необходимо выяснить, это предполагалось ли наличие символа в библиотеке
Например
, если символ в начале это gtk, он принадлежит библиотеке gtk. Если имя библиотеки легко определимо
, (frobnicate_foobar), вы можете вывести список символов библиотеки командой nm
. Например,
$ nm libglloq.so
0000000000109df0 d glloq_message_func
000000000010a984 b glloq_msg
0000000000008a58 t glloq_nearest_pow
0000000000109dd8 d glloq_free_list
0000000000109cf8 d glloq_mem_chunk
Добавив параметр -o к nm
, вы получите вывод имени библиотеки в каждой строке, что облегчит поиск
. Давайте предположим, что мы ищем символ bulgroz_max, сырое решение поиска выглядит так
:
$ nm /usr/lib/lib*.so | grep bulgroz_max
$ nm /usr/X11R6/lib/lib*.so | grep bulgroz_max
$ nm /usr/local/lib/lib*.so | grep bulgroz_max
/usr/local/lib/libfrobnicate.so:000000000004d848 T bulgroz_max
Замечательно
! Символ bulgroz_max определен в библиотеке frobnicate (большая буква T стоит перед ее именем
). Теперь вам только нужно добавить строку -lfrobnicate в строку компиляции,
отредактировав файл Makefile
: добавьте ее в конец строки, где определены LDFLAGS или LFGLAGS
(или, на худой конец, CC) , или в строку, соответствующую созданию конечного бинарного файла.

компиляция производится с версией библиотеки
, которая не подходит для данного программного обеспечения
. Читайте README или INSTALL чтобы узнать, какая версия должна использоваться.

не все объектные файлы поставки были корректно слинкованы
. Файл, в котором определена функция
, отсутствует. Напишите nm -o *.o чтобы узнать что это за файл и добавить соответствующий файл .o в строку компиляции
, если его не хватает.

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


Поделитесь с Вашими друзьями:
1   ...   4   5   6   7   8   9   10   11   12


База данных защищена авторским правом ©nethash.ru 2019
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал