Введение в разработку приложений на платформе Atom/MeeGo. Граничин О.Н - 34 стр.

UptoLike

34
Линковка с внешними библиотеками
В каталоге
lab02/0
3 файла labMeeGo.rar. находится пример кода, имеющего зависимости от
внешних библиотек. В процессе его сборки потребуется линковка с этими библиотеками. Для
компиляции этого кода необходимо:
· установить библиотеку ncurses
apt-get install libncurses-dev
· компилировать и ассемблировать модули (аналогично предыдущему примеру)
· прилинковать модули и библиотеку ncurses в один исполняемый файл
gcc -lncurses -o hello hello_main.o hello_util.o
По умолчанию компилятор gcc выполняет динамическую линковку: в созданном исполняемом
файле указывается ссылка на необходимую библиотеку и перечень символов (функций, переменных)
этой библиотеки, используемых в компилируемом коде. При вызове полученного исполняемого
файла загрузчик ОС прочитает эти зависимости и попытается найти в одном из заданных заранее
каталогах (например, /usr/lib) соответствующую библиотеку динамической линковки. Обычно это
файл с расширением *.so (от «shared object») и названием, совпадающим с названием библиотеки,
указанным при помощи ключа -l, за исключением префикса «lib». К примеру, в нашем случае будет
искаться файл libncurses.so. Обнаружив необходимую библиотеку, загрузчик поместит её в память,
а также заместит в загруженном в память образе исполняемого файла ссылки на внешние функции
указателями на конкретные адреса в памяти, в соответствии с адресом загрузки библиотеки. В случае,
если необходимая библиотека не будет обнаружена, будет выдана ошибка загрузчика и программа не
будет выполнена.
При необходимости, вместо динамической линковки может быть выполнена статическая. В этом
случае линковщик попытается найти библиотеку статической линковки. Обычно это файл с
расширением *.a и названием, сформированным по тому же принципу, что и название файла
библиотеки динамической линковки. Если необходимый файл найден, линковщик поместит целиком
его исполняемый код в выходной исполняемый файл, подобно тому, как в него помещаются модули
компилируемого проекта.
· Для сборки скомпилированных на предыдущем этапе объектов со статической линковкой с
библиоткой ncurses, выполните
gcc -o hello_static hello_main.o hello_util.o -static -lnucrses
Применение статической линковки в большинстве случаев неоправданно, так как размер
исполняемого файла при этом сильно увеличивается. Сравните размеры полученных в этом примере
исполняемых файлов hello и hello_static, вызвав команду
ls -lh hello hello_static
Компиляция кода на С++
Пакет компиляторов gcc способен компилировать код для C, C++, Objective C, Fortran и т. д.
Используемый язык программирования определяется по расширению файла, но может также быть
задан при помощи ключа компилятора. Поэтому в примере
gcc -c myfile.cpp
где файл myfile.cppэто код на C++, компиляция пройдет успешно. Однако, если мы опустим
ключ -c, сборка завершится с многочисленными ошибками линковки. Это вызвано тем, что при
сборке при помощи gcc, автоматически выполняется линковка со стандартной библиотекой C, но не
со стандартной библиотекой C++. Недостающая зависимость может быть указана при помощи ключа
компилятора, однако для удобства обычно используется g++обёртка вокруг компилятора gcc. При
её использовании связь со стандартной библотекой C++ указывается автоматически. Синтаксис g++
идентичен синтаксису gcc.