Как собрать библиотеку c из исходников
Перейти к содержимому

Как собрать библиотеку c из исходников

  • автор:

Пошаговое руководство. Создание и использование статической библиотеки

В этом пошаговом руководстве описывается создание статической библиотеки (LIB-файла) для использования с приложениями C++. Статические библиотеки являются хорошим способом повторного использования кода. Вместо того чтобы каждый раз реализовывать одни и те же подпрограммы для обеспечения той или иной функциональности в каждом создаваемом приложении, их можно создать единожды и затем вызывать из приложений. Код, подключенный из статической библиотеки, становится частью вашего приложения — для использования кода не нужно устанавливать еще какой-либо файл.

В этом пошаговом руководстве рассматриваются следующие задачи:

  • Создание проекта статической библиотеки
  • Добавление класса в статическую библиотеку
  • Создание консольного приложения C++, ссылающегося на статическую библиотеку
  • Использование функциональности из статической библиотеки в приложении
  • Запуск приложения

Необходимые компоненты

Для работы необходимо владеть основами языка C++.

Создание проекта статической библиотеки

Инструкции по созданию проекта зависят от используемой версии Visual Studio. Чтобы ознакомиться с документацией по предпочтительной версии Visual Studio, используйте селектор Версия. Он находится в верхней части оглавления на этой странице.

Создание проекта статической библиотеки в Visual Studio

  1. В строке меню выберите «Файл>нового проекта«>, чтобы открыть диалоговое окно «Создать проект».
  2. В верхней части диалогового окна для параметра Язык установите значение C++, для параметра Платформа — значение Windows, а для параметра Тип проекта — значение Библиотека.
  3. В отфильтрованном списке типов проектов выберите пункт Мастер классических приложений Windows, а затем нажмите кнопку Далее.
  4. На странице Настроить новый проект введите MathLibrary в поле Имя проекта. В поле Имя решения введите StaticMath. Нажмите кнопку Создать, чтобы открыть диалоговое окно Проект классического приложения Windows.
  5. В диалоговом окне Проект классического приложения Windows в разделе Тип приложения выберите Статическая библиотека (.lib).
  6. В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок, если он установлен. Установите флажок Пустой проект.
  7. Нажмите кнопку ОК, чтобы создать проект.

Создание проекта статической библиотеки в Visual Studio 2017

  1. В строке меню выберите Файл >Создать >Проект.
  2. В диалоговом окне Новый проект выберите Установленные>Visual C++>Классическое приложение для Windows. На центральной панели выберите Мастер классических приложений Windows.
  3. Укажите имя для проекта, например MathLibrary, в поле Имя. Укажите имя для решения, например StaticMath, в поле Имя решения. Нажмите кнопку ОК.
  4. В диалоговом окне Проект классического приложения Windows в разделе Тип приложения выберите Статическая библиотека (.lib).
  5. В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок, если он установлен. Установите флажок Пустой проект.
  6. Нажмите кнопку ОК, чтобы создать проект.

Создание проекта статической библиотеки в Visual Studio 2015

  1. В строке меню выберите Файл >Создать >Проект.
  2. В диалоговом окне Новый проект выберите Установленные>Шаблоны>Visual C++>Win32. В центральной области выберите Консольное приложение Win32.
  3. Укажите имя для проекта, например MathLibrary, в поле Имя. Укажите имя для решения, например StaticMath, в поле Имя решения. Нажмите кнопку ОК.
  4. В мастере приложений Win32 нажмите кнопку Далее.
  5. На странице Параметры приложения в разделе Тип приложения выберите Статическая библиотека. В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок. Чтобы создать проект, нажмите кнопку Готово.

Добавление класса в статическую библиотеку

Добавление класса в статическую библиотеку

  1. Чтобы создать файл заголовка для нового класса откройте контекстное меню проекта MathLibrary в обозревателе решений, а затем выберите Добавить>Новый элемент.
  2. В диалоговом окне Добавление нового элемента выберите пункт Visual C++>Код. В центральной области выберите Заголовочный файл (.h). Укажите имя для файла заголовка, например MathLibrary.h, и нажмите кнопку Добавить. Отобразится почти пустой файл заголовка.
  3. Добавьте объявление класса с именем Arithmetic для выполнения обычных арифметических операций, таких как сложение, вычитание, умножение и деление. Код должен выглядеть примерно так:
// MathLibrary.h #pragma once namespace MathLibrary < class Arithmetic < public: // Returns a + b static double Add(double a, double b); // Returns a - b static double Subtract(double a, double b); // Returns a * b static double Multiply(double a, double b); // Returns a / b static double Divide(double a, double b); >; > 
// MathLibrary.cpp // compile with: cl /c /EHsc MathLibrary.cpp // post-build command: lib MathLibrary.obj #include "MathLibrary.h" namespace MathLibrary < double Arithmetic::Add(double a, double b) < return a + b; >double Arithmetic::Subtract(double a, double b) < return a - b; >double Arithmetic::Multiply(double a, double b) < return a * b; >double Arithmetic::Divide(double a, double b) < return a / b; >> 

Примечание. При выполнении сборки из командной строки Visual Studio программа собирается в два этапа. Сначала выполните компиляцию cl /c /EHsc MathLibrary.cpp кода и создайте файл объекта с именем MathLibrary.obj. (Команда cl вызывает компилятор, Cl.exe и /c параметр указывает компиляцию без связывания. Дополнительные сведения см. в разделе Параметр /c (компиляция без связывания). Во-вторых, запустите файл lib MathLibrary.obj , чтобы связать код и создать статическую библиотеку MathLibrary.lib. (Команда lib вызывает диспетчер библиотек, Lib.exe. Дополнительные сведения см. в справочнике по LIB.)

Создание консольного приложения C++, ссылающегося на статическую библиотеку

Создание консольного приложения C++, ссылающегося на статическую библиотеку, в Visual Studio

  1. В обозревателе решений щелкните правой кнопкой мыши узел верхнего уровня Решение StaticMath, чтобы открыть контекстное меню. Выберите пункты Добавить>Новый проект, чтобы открыть диалоговое окно Добавить новый проект.
  2. В верхней части диалогового окна задайте для фильтра Тип проекта значение Консоль.
  3. В отфильтрованном списке типов проектов щелкните Консольное приложение, а затем нажмите кнопку Далее. На следующей странице в поле Имя введите имя проекта MathClient.
  4. Нажмите кнопку Создать, чтобы создать клиентский проект.
  5. После создания консольного приложения будет создана пустая программа. Имя исходного файла будет совпадать с ранее выбранным именем. В этом примере он имеет имя MathClient.cpp .

Создание консольного приложения C++, ссылающегося на статическую библиотеку, в Visual Studio 2017

  1. В обозревателе решений щелкните правой кнопкой мыши узел верхнего уровня Решение StaticMath, чтобы открыть контекстное меню. Выберите пункты Добавить>Новый проект, чтобы открыть диалоговое окно Добавить новый проект.
  2. В диалоговом окне Добавление нового проекта выберите Установленные>Visual C++>Классическое приложение для Windows. На центральной панели выберите Мастер классических приложений Windows.
  3. Укажите имя для проекта, например MathClient, в поле Имя. Нажмите кнопку ОК.
  4. В диалоговом окне Проект классического приложения Windows в разделе Тип приложения выберите Консольное приложение (EXE).
  5. В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок, если он установлен.
  6. Нажмите кнопку ОК, чтобы создать проект.
  7. После создания консольного приложения будет создана пустая программа. Имя исходного файла будет совпадать с ранее выбранным именем. В этом примере он имеет имя MathClient.cpp .

Создание консольного приложения C++, ссылающегося на статическую библиотеку, в Visual Studio 2015

  1. В обозревателе решений щелкните правой кнопкой мыши узел верхнего уровня Решение StaticMath, чтобы открыть контекстное меню. Выберите пункты Добавить>Новый проект, чтобы открыть диалоговое окно Добавить новый проект.
  2. В диалоговом окне Добавление нового проекта выберите Установленные>Visual C++>Win32. В центральной области выберите Консольное приложение Win32.
  3. Укажите имя для проекта, например MathClient, в поле Имя. Нажмите кнопку ОК.
  4. В диалоговом окне Мастер приложений Win32 нажмите кнопку Далее.
  5. На странице Параметры приложения выберите в поле Тип приложения пункт Консольное приложение. В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок, а затем установите флажок Пустой проект. Чтобы создать проект, нажмите кнопку Готово.
  6. Чтобы добавить исходный файл в пустой проект, щелкните правой кнопкой мыши, чтобы открыть контекстное меню проекта MathClient в Обозреватель решений, а затем нажмите кнопку «Добавить >новый элемент».
  7. В диалоговом окне Добавление нового элемента выберите пункт Visual C++>Код. В центральной области выберите Файл C++ (.cpp). Укажите имя исходного файла, например MathClient.cpp, и нажмите кнопку Добавить. Отобразится пустой исходный файл.

Использование функциональности из статической библиотеки в приложении

Использование функциональности из статической библиотеки в приложении

  1. Для использования математических процедур из статической библиотеки необходимо сослаться на эту библиотеку. В обозревателе решений откройте контекстное меню проекта MathClient, а затем выберите команду Добавить>Ссылка.
  2. В диалоговом окне Добавление ссылки перечислены библиотеки, на которые можно создать ссылку. На вкладке Проекты перечислены проекты текущего решения и все библиотеки, на которые они ссылаются. На вкладке Проекты установите флажок MathLibrary, а затем нажмите кнопку ОК.
  3. Для создания ссылки на файл заголовка MathLibrary.h необходимо изменить путь к каталогам включаемых файлов. В обозревателе решений щелкните правой кнопкой мыши проект MathClient, чтобы открыть контекстное меню. Выберите пункт Свойства, чтобы открыть диалоговое окно Страницы свойств MathClient.
  4. В диалоговом окне Страницы свойств MathClient в раскрывающемся списке Конфигурация выберите пункт Все конфигурации. В раскрывающемся списке Платформа выберите пункт Все платформы.
  5. Перейдите на страницу свойств Свойства конфигурации>C/C++>Общие. В свойстве Дополнительные каталоги включаемых файлов укажите путь к каталогу MathLibrary или найдите этот каталог. Чтобы найти путь к каталогу, выполните указанные ниже действия.
    1. Откройте раскрывающийся список значений свойства Дополнительные каталоги включаемых файлов, а затем выберите Изменить.
    2. В диалоговом окне Дополнительные каталоги включаемых файлов дважды щелкните в верхней части текстового поля. Нажмите кнопку с многоточием (. ) в конце строки.
    3. В диалоговом окне Выбор каталога перейдите на уровень вверх и выберите каталог MathLibrary. Затем нажмите кнопку Выбрать папку, чтобы сохранить выбор.
    4. В диалоговом окне Дополнительные каталоги включаемых файлов нажмите кнопку ОК.
    5. В диалоговом окне Страницы свойств нажмите кнопку OK, чтобы сохранить изменения в проекте.
    // MathClient.cpp // compile with: cl /EHsc MathClient.cpp /link MathLibrary.lib #include #include "MathLibrary.h" int main() < double a = 7.4; int b = 99; std::cout 
    

    Выполнить приложение

    Запуск приложения

    1. Убедитесь в том, что проект MathClient выбран в качестве проекта по умолчанию. Чтобы выбрать его, в обозревателе решений откройте контекстное меню проекта MathClient и выберите команду Назначить запускаемым проектом.
    2. Чтобы запустить проект, в строке меню выберите Отладка>Запуск без отладки. Выходные данные должны выглядеть примерно так:
    a + b = 106.4 a - b = -91.6 a * b = 732.6 a / b = 0.0747475 

    Как собрать библиотеку c из исходников

    Пользователь

    Регистрация: 11.08.2008

    Сообщений: 19

    Компиляция (сборка) библиотеки из исходников

    Здравствуйте, у меня есть проблема. Я не могу при помощи той среды в которой я программирую скомпилировать стороннюю библиотеку.
    Я скачал библиотеку для работы с форматом mseed, которая называется
    libmseed, в которой есть примеры и исходники самой библиотеки. Есть make-файлы для сборки в том числе и под винду, но у меня не получилось её собрать. У меня 7-ка и я не прописывал переменные окружения в path до nmake потому что я не понимаю какой nmake мне нужен. Посмотрел по поиску и их у меня несколько. (Кстати как задать путь до nmake в path d 7-ке). Может мне кто помочь советом как вообще надо собирать библиотеку на винде. В результате я бы хотел получить просто статическую библиотеку.

    Как собирать статические библиотеки из исходников?

    Здравствуйте!
    Подскажите пожалуйста, как собирать lib файлы
    Книга подсказала мне, что лучше всего собирать исходники на той машине, где я собираюсь программировать, но делать такого мне не доводилось, а уж тем-более компилировать чужой код, в неизвестный мне тип файла

    Структура исходников GLUT

    5c225592d35b8535487414.png

    Я вижу, что скорее всего, структура этого архива составлена по какой-то спецификации, следуя стандарту, значит и должен быть универсальный способ собирать такие архивы, подскажите пожалуйста как

    • Вопрос задан более трёх лет назад
    • 1419 просмотров

    1 комментарий

    Простой 1 комментарий

    Конкретно GLUT не собирал, но другие библиотеки с открытыми исходниками регулярно приходится.
    Самый простой вариант для MSVC - использовать микрософтовский менеджер пакетов vcpkg. У него уже есть в пакетах freeglut. Если это то что вам нужно, то рекомендую установить vcpkg с помощью него собрать glut и можете использовать.
    Если этот вариант не подходит - изучайте документацию по сборке конкретно вашей версии под msvc. Вижу, что есть файл readme.win - там, скорее всего есть описание сборки под винду. Так же вижу файл glutmake.bat - видимо это запуск процесса сборки под винду.

    Если используете mingw, то там обычно работают сценарии сборки для Linux:
    .\configure
    make
    make install
    Но я в этом случае использую msys2 + mingw - в msys2 входит свой менеджер пакетов pacman, устанавливаете нужную библиотеку с его помощью (аналогично как это делается в линуксе).

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

    Решения вопроса 1
    Alexander Movchan @Alexander1705

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

    Для C/C++ де-факто стандрата сборки нет, но есть несколько систем сборки, которые обычно используються:

    make - очень простая утилита, но неудобно для больших проектов.
    Можно определить по наличию файла Makefile. Иногда этот файл генерируеться скриптом configure.
    Если есть Makefile, запускаем:
    $ make
    Удалить сгенерированные файлы (чтобы запустить сборку заново):
    $ make clean

    cmake- более высокоуровневая система сборки, генерирует проекты для IDE или те же Makefile.
    Можно определить по наличию CMakeLists.txt

    mkdir cmake-build # Создаём папку для сгенерированных файлов, чтобы не смешивались с исходниками # Это называеться out-of-source build cd cmake-build # Генерируем проект или Makefile cmake .. # Запускаем билд, можно просто запустить make cmake --build .

    qmake - система сборки разработаная для сборки Qt и проектов использующих Qt.
    Можно определить по наличию .pro файлов. Билдим так:

    qmake make

    В вашем случае используеться make.

    Библиотеки в Си. Сборка программы со статической и динамической библиотеками

    Библиотеки позволяют использовать созданный ранее программный код в различных программах. Таким образом, программист может не разрабатывать часть кода для своей программы, а воспользоваться тем, что входит в состав библиотек.

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

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

    При компиляции программы библиотеки подключаются линковщиком, который вызывается gcc . Если программе требуются только стандартные библиотеки, то дополнительных параметров линковщику передавать не надо (есть исключения). Он "знает", где стандартные библиотеки находятся, и подключит их автоматически. Во всех остальных случаях при компиляции программы требуется указать имя библиотеки и ее местоположение.

    Библиотеки бывают двух видов — статические и динамические. Код первых при компиляции полностью входит в состав исполняемого файла, что делает программу легко переносимой. Код динамических библиотек не входит в исполняемый файл, последний содержит лишь ссылку на библиотеку. Если динамическая библиотека будет удалена или перемещена в другое место, то программа работать не будет. С другой стороны, использование динамических библиотек позволяет сократить размер исполняемого файла. Также если в памяти находится две программы, использующие одну и туже динамическую библиотеку, то последняя будет загружена в память лишь единожды.

    Далее будет описан пример, в котором создается библиотека, после чего используется при создании программы.

    Пример создания библиотеки

    Допустим, мы хотим создать код, который в дальнейшем планируем использовать в нескольких проектах. Следовательно, нам требуется создать библиотеку. Ее исходный код разместим в двух файлах.

    Также у нас будет проект, использующая эту библиотеку. Он тоже будет включать два файла.

    В итоге, когда все будет сделано, схема каталогов и файлов будет выглядеть так:

    Схема проекта с библиотекой

    Пусть каталоги library и project находятся в одном общем каталоге, например, домашнем каталоге пользователя. Каталог library содержит каталог source с файлами исходных кодов библиотеки. Также в library будут находиться заголовочный файл (содержащий описания функций библиотеки), статическая ( libmy1.a ) и динамическая ( libmy2.so ) библиотеки. Каталог project будет содержать файлы исходных кодов проекта и заголовочный файл с описанием функций проекта. Также после компиляции с подключением библиотеки здесь будет располагаться исполняемый файл проекта.

    В операционных системах GNU/Linux имена файлов библиотек должны иметь префикс "lib", статические библиотеки - расширение *.a , динамические - *.so .

    Для компиляции проекта достаточно иметь только одну библиотеку: статическую или динамическую. В образовательных целях мы получим обе и сначала скомпилируем проект со статической библиотекой, потом — с динамической. Статическая и динамическая "разновидности" одной библиотеки по-идее должны называться одинаково (различаются только расширения). Поскольку у нас обе библиотеки будут находиться в одном каталоге, то чтобы быть уверенными, что при компиляции проекта мы используем ту, которую хотим, их названия различны ( libmy1 и libmy2 ).

    Исходный код библиотеки

    #include void rect(char sign, int w, int h)  putchar('\n'); } for (i = 0; i  w; i++) putchar(sign); putchar('\n'); } void diagonals(char sign, int w)  putchar('\n'); } }

    В файле figure.c содержатся две функции — rect и diagonals . Первая принимает в качестве аргументов символ и два числа и "рисует" на экране с помощью указанного символа прямоугольник заданной ширины и высоты. Вторая функция выводит на экране две диагонали квадрата ("рисует" крестик).

    #include void text(char *ch) { while (*ch++ != '\0') putchar('*'); putchar('\n'); }

    В файле text.c определена единственная функция, принимающая указатель на символ строки. Функция выводит на экране звездочки в количестве, соответствующем длине указанной строки.

    void rect(char sign, int width, int height); void diagonals(char sign, int width); void text(char *ch); 

    Заголовочный файл можно создать в каталоге source , но мы лучше сохраним его там, где будут библиотеки. В данном случае это на уровень выше (каталог library ). Тем самым как бы подчеркивается, что файлы исходных кодов после создания из них библиотеки вообще не нужны пользователям библиотек, они нужны лишь разработчику библиотеки. А вот заголовочный файл библиотеки требуется для ее правильного использования.

    Создание статической библиотеки

    Статическую библиотеку создать проще, поэтому начнем с нее. Она создается из обычных объектных файлов путем их архивации с помощью утилиты ar .

    Все действия, которые описаны ниже выполняются в каталоге library (т.е. туда надо перейти командой cd ). Просмотр содержимого каталога выполняется с помощью команды ls или ls -l .

    Получаем объектные файлы:

    gcc -c ./source/*.c

    В итоге в каталоге library должно наблюдаться следующее:

    figures.o mylib.h source text.o

    Далее используем утилиту ar для создания статической библиотеки:

    ar r libmy1.a *.o

    Параметр r позволяет вставить файлы в архив, если архива нет, то он создается. Далее указывается имя архива, после чего перечисляются файлы, из которых архив создается.

    Объектные файлы нам не нужны, поэтому их можно удалить:

    rm *.o

    В итоге содержимое каталога library должно выглядеть так:

    libmy1.a mylib.h source

    , где libmy1.a — это статическая библиотека.

    Создание динамической библиотеки

    Объектные файлы для динамической библиотеки компилируются особым образом. Они должны содержать так называемый позиционно-независимый код (position independent code). Наличие такого кода позволяет библиотеке подключаться к программе, когда последняя загружается в память. Это связано с тем, что библиотека и программа не являются единой программой, а значит как угодно могут располагаться в памяти относительно друг друга. Компиляция объектных файлов для динамической библиотеки должна выполняться с опцией -fPIC компилятора gcc :

    gcc -c -fPIC source/*.c

    В отличие от статической библиотеки динамическую создают при помощи gcc указав опцию -shared :

    gcc -shared -o libmy2.so *.o

    Использованные объектные файлы можно удалить:

    rm *.o

    В итоге содержимое каталога library :

    libmy1.a libmy2.so mylib.h source

    Использование библиотеки в программе

    Исходный код программы

    Теперь в каталоге project (который у нас находится на одном уровне файловой иерархии с library ) создадим файлы проекта, который будет использовать созданную библиотеку. Поскольку сама программа будет состоять не из одного файла, то придется здесь также создать заголовочный файл.

    #include #include "../library/mylib.h" void data(void) { char strs[3][30]; char *prompts[3] = { "Ваше имя: ", "Местонахождение: ", "Пунк прибытия: "}; int i; for (i = 0; i  3; i++) { printf("%s", prompts[i]); fgets(strs[i], 30, stdin); } diagonals('~', 7); for (i = 0; i  3; i++) { printf("%s", prompts[i]); text(strs[i]); } }

    Функция data запрашивает у пользователя данные, помещая их в массив strs . Далее вызывает библиотечную функцию diagonals() , которая выводит на экране "крестик". После этого на каждой итерации цикла вызывается библиотечная функция text() , которой передается очередной элемент массива; функция text выводит на экране звездочки в количестве равном длине переданной через указатель строки.

    Обратите внимание на то, как подключается заголовочный файл библиотеки: через относительный адрес. Две точки обозначают переход в каталог на уровень выше, т. е. родительский по отношению к project , после чего путь продолжается в каталог library , вложенный в родительский. Можно было бы указать абсолютный путь, например, "/home/pl/c/les22/library/mylib.h". Однако при перемещении каталогов библиотеки и программы на другой компьютер или в другой каталог адрес был бы уже не верным. В случае с относительным адресом требуется лишь сохранять расположение каталогов project и library относительно друг друга.

    #include #include "../library/mylib.h" #include "project.h" int main() { rect('-',75,4); data(); rect('+',75,3); } 

    Здесь два раза вызывается библиотечная функция rect() и один раз функция data() из другого файла проекта. Чтобы сообщить функции main прототип data также подключается заголовочный файл проекта.

    Файл project.h содержит всего одну строчку:

    void data(void);

    Из обоих файлов проекта с исходным кодом надо получить объектные файлы для объединения их потом с файлом библиотеки. Сначала мы получим исполняемый файл, содержащий статическую библиотеку, потом — связанный с динамической библиотекой. Однако с какой бы библиотекой мы не компоновали объектные файлы проекта, компилируются они как для статической, так и динамической библиотеки одинаково:

    gcc -c *.c

    При этом не забудьте сделать каталог project текущим!

    Компиляция проекта со статической библиотекой

    Теперь в каталоге project есть два объектных файла: main.o и data.o . Их надо скомпилировать в исполняемый файл project , объединив со статической библиотекой libmy1.a . Делается это с помощью такой команды:

    gcc -o project *.o -L../library -lmy1

    Начало команды должно быть понятно: опция -o указывает на то, что компилируется исполняемый файл project из объектных файлов.

    Помимо объектных файлов проекта в компиляции участвует и библиотека. Об этом свидетельствует вторая часть команды: -L../library -lmy1 . Здесь опция -L указывает на адрес каталога, где находится библиотека, он и следует сразу за ней. После опции -l записывается имя библиотеки, при этом префикс lib и суффикс (неважно .a или .so ) усекаются. Обратите внимание, что после данных опций пробел не ставится.

    Опцию -L можно не указывать, если библиотека располагается в стандартных для данной системы каталогах для библиотек. Например, в GNU/Linux это /lib/ , /urs/lib/ и др.

    Запустив исполняемый файл project и выполнив программу, мы увидим на экране примерно следующее:

    Выполнение готовой программы

    Посмотрим размер файла project :

    pl@desk:~/c/les22/project$ ls -l project -rwxrwxr-x 1 pl pl 16352 дек 19 02:02 project

    Его размер равен 16352 байт.

    Компиляция проекта с динамической библиотекой

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

    gcc -o project *.o \ > -L../library -lmy2 -Wl,-rpath. /library/

    Здесь в отличии от команды компиляции со статической библиотеки добавлены опции для линковщика: -Wl,-rpath. /library/ . -Wl ‒ это обращение к линковщику, -rpath ‒ опция линковщика, ../library/ ‒ значение опции. Получается, что в команде мы два раза указываем местоположение библиотеки: один раз с опцией -L , а второй раз с опцией -rpath .

    Следует заметить, что если вы скомпилируете программу, используя приведенную команду, то исполняемый файл будет запускаться из командной строки только в том случае, если текущий каталог project . Стоит сменить каталог, будет возникать ошибка из-за того, что динамическая библиотека не будет найдена. Но если скомпилировать программу так:

    gcc -o project *.o -L../library -lmy2 \ > -Wl,-rpath,/home/pl/c/library

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

    Размер исполняемого файла проекта, связанного с динамической библиотекой, будет немного меньше. Если посмотреть на размеры библиотек:

    pl@desk:~/c/les22/library$ ls -l libmy* -rw-rw-r-- 1 pl pl 3616 дек 19 00:16 libmy1.a -rwxrwxr-x 1 pl pl 15592 дек 19 00:33 libmy2.so

    , то видно, что динамическая больше статической, хотя исполняемый файл проекта со статической библиотекой больше. Это доказывает, что в исполняемом файле, связанном с динамической библиотекой, присутствует лишь ссылка на нее.

    Курс с решением задач:
    pdf-версия

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *