2

Я работал над Linux в течение года. Меня беспокоит то, что я не знаком с процессом установки нового программного обеспечения с исходным кодом (я не могу установить их из netword из-за ограничений среды).

Меня часто блокировали из-за разного рода ошибок, например:

------------------------
libtool: install: error: relink `Magick++/lib/libMagick++.la' with the above command before installing it
------------------------

или же

------------------------
magick/.libs/libMagickCore.so: undefined reference to `gzseek64'
magick/.libs/libMagickCore.so: undefined reference to `gztell64'
------------------------

Хотя я наконец нашел решение с Google, я не знаю точно, почему это работает.

Может кто-нибудь помочь мне в этой ситуации или дать мне совет, как улучшить себя в таких вещах?

Мне не хватает знаний о "configure", "make", «разнице в 64-битной», "shared lib"; Кто-нибудь может указать мне правильное направление и дать мне несколько полезных книг или статей?

1 ответ1

2

Ну, для начала нужно начать с GNU make manual и GNU autoconf manual. http://www.gnu.org/software/make/manual/make.html и http://www.gnu.org/software/autoconf/manual/autoconf.html Вам не нужно все понимать сейчас, но это даст вам ощущение того, что происходит за кулисами.

В основном, когда вы настраиваете программу, создается файл make для вашей системы. Сегодня большая часть разработки программного обеспечения выполняется с использованием готового кода, который упакован в так называемые библиотеки. Таким образом, программистам не нужно фокусироваться на некоторых вещах, которые очень важны, но в то же время не имеют отношения к их программе. Взять, к примеру, графический интерфейс пользователя. В сегодняшних программах это неизбежное зло, потому что на данный момент у нас нет ничего более продвинутого. Хотя многие программы должны иметь графический интерфейс, это не особенно интересно для программиста, который делает программу. Вместо этого он захочет сосредоточиться на его основной функции. Вот почему библиотеки GUI часто используются.

Когда вы компилируете программу, компилятор должен знать, где найти все библиотеки, которые использует программа. Make будет использовать make-файл, настроенный autoconf, чтобы сообщить компилятору, где их искать. Autoconf обнаружит вашу систему и соответствующим образом настроит make-файл.

Также вы могли заметить, что исходный код программ содержится во многих файлах. Эти файлы обычно компилируются отдельно. Make также заботится о порядке компиляции этих файлов. Как только все файлы скомпилированы, их необходимо объединить в одну программу. Линкер делает это. В итоге вы получаете исполняемый файл, который можете вызвать.

Еще одна интересная вещь - нет необходимости вызывать компилятор вручную. Make вызовет его и автоматически использует соответствующие настройки.

Теперь об ошибках, которые вы получаете: неопределенные ошибки ссылок связаны с тем, что autoconf каким-то образом сконфигурировал make-файл для вашей системы без правильного определения всех зависимостей. Ваша программа должна быть правильно установлена на zlib перед компиляцией. Autoconf должен был сказать вам об этом, но, похоже, вы начали make, который запустил компилятор, который не может найти zlib и выдает ошибки.

Первая ошибка сделана из-за того, что называется условной компиляцией. По сути, вы можете сказать autoconf, что не хотите использовать часть программы. Затем autoconf изменяет make-файл таким образом, что часть программы не компилируется. Мне кажется, что когда Magick++ был скомпилирован, некоторые опции были отключены. Это в основном говорит вам, что вам нужно включить их.

Немного о разделяемых библиотеках. Когда программа использует библиотеку, она может использоваться как статическая библиотека, которая связана, так что она является частью программы или динамической библиотекой, которая фактически не является частью программы. Статические библиотеки хороши, когда вам нужна программа, которая не зависит от чего-либо еще, но она занимает место в ОЗУ, и если несколько программ используют одну и ту же библиотеку, каждая из них должна будет загрузить ее в ОЗУ для собственного использования. С динамическими библиотеками все немного по-другому. После запуска программы она загружает библиотеку в оперативную память и использует ее. Библиотека не является частью программы, поэтому ее необходимо установить отдельно. Однако, если несколько программ используют одну и ту же библиотеку, ее нужно загрузить только один раз в ОЗУ, и все программы будут использовать одну и ту же копию. Это почти всегда используется с библиотеками GUI.

В конце концов, поскольку ваш компьютер не имеет доступа к Интернету, будьте готовы к большим и большим страданиям. Вы никогда не узнаете, когда какая-то программа нуждается в неясной зависимости или когда установленная вами версия программы несовместима с версией, в которой нуждается ваша новая программа.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .