Подтвердить что ты не робот

Динамические и статические библиотеки в С++

В моем стремлении изучить С++ я столкнулся с динамическими и статическими библиотеками.

Я обычно получаю их суть: скомпилированный код для включения в другие программы.

Однако я хотел бы узнать несколько вещей о них:

  • Записывает ли они какую-либо отличную от обычной программу на С++, минус функцию main()?
  • Как скомпилированная программа становится библиотекой? Это, очевидно, не исполняемый файл, поэтому как мне повернуть, скажем 'test.cpp' в 'test.dll'?
  • Как только я получаю его в своем формате, как включить его в другую программу?
  • Есть ли стандартное место для их размещения, чтобы любые компиляторы/линкеры не нуждались в них, они могут легко найти их?
  • В чем разница (технически и практически) между динамической и статической библиотекой?
  • Как использовать сторонние библиотеки в моем коде (я смотрю на .dylib и .a файлы для MySql С++ Connector)

Все, что я нашел в отношении библиотек, похоже, предназначено для тех, кто уже знает, как их использовать. Я, однако, не знаю. (Но хотелось бы!)

Спасибо!

(Я также должен отметить, что я использую Mac OS X, и хотя предпочел бы оставаться нейтральным или ориентированным на IDE, я использую QtCreator/Netbeans)

4b9b3361

Ответ 1

Записывает ли они какую-либо отличную от обычной программу на С++ минус функция main()?

Нет.

Как скомпилированная программа становится библиотекой? Это, очевидно, не исполняемый файл, поэтому как мне повернуть, скажем 'test.cpp' в 'test.dll'?

Передайте флаг -dynamiclib во время компиляции. (Имя результата по-прежнему по умолчанию a.out. В Mac OS X вы должны назвать свои динамические библиотеки как lib***.dylib, а также в Linux, lib***.so (общие объекты))

Как только я получу его в своем формате, как включить его в другую программу?

Сначала создайте файл заголовка, чтобы другая программа могла #include знать, какие функции могут использоваться в вашем dylib.

Во-вторых, ссылку на ваш dylib. Если ваш dylib называется libblah.dylib, вы передаете флаг -lblah в gcc.

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

/usr/lib или /usr/local/lib.

В чем разница (технически и практически) между динамической и статической библиотекой?

В принципе, для статического lib вся библиотека встроена в файл, к которому он привязан.

Как использовать сторонние библиотеки в моем коде (я смотрю на .dylib и .a файлы для MySql С++ Connector)

См. третий ответ.

Ответ 2

Записывает ли они какую-либо отличную от обычной программу на С++ минус функция main()?

За исключением очевидного различия в том, что библиотека предоставляет услуги для использования других программ, обычно (*) нет разницы.

* в gcc-классах/функциях экспортируется по умолчанию - это не относится к VС++, там вы должны явно экспортировать с помощью __declspec(export).

Как скомпилированная программа становится библиотекой? Это, очевидно, не исполняемый файл, поэтому как мне повернуть, скажем 'test.cpp' в 'test.dll'?

Это зависит от вашего компилятора. В Visual Studio вы укажете это в своей конфигурации проекта. В gcc для создания статической библиотеки вы обычно компилируете свой код, а затем упаковываете его в архив с помощью ar. Чтобы создать общий, который вы сначала скомпилируете (с флагом -fpic, чтобы включить независимое от кода генерирование кода, требование для общих библиотек), затем используйте флаг -shared в объектных файлах. Более подробную информацию можно найти на страницах руководства.

Как только я получаю его в своем формате, как его включить в другую программу?

Опять же, это немного зависит от компилятора. В VS, если это общая библиотека, при включении класса/функции, которую вы хотите использовать, должна быть отмечена __declspec(import) (обычно это делается с помощью ifdefs), и вам нужно указать файл .lib общей библиотеки для связь. Для статической библиотеки вам нужно указать только файл .lib(нет необходимости в экспорте/импорте, поскольку код будет в вашем исполняемом файле).

В gcc вам нужно указать библиотеку, с которой вы ссылаетесь, используя -llibrary_name.

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

Есть ли стандартное место для их размещения, чтобы любые компиляторы/линкеры нуждались в них, они могут легко найти их?

Если это ваша собственная библиотека, то это зависит от вас. Обычно вы можете указать дополнительные папки компоновщика для поиска. У нас есть папка lib в нашем исходном дереве, где все файлы .lib (или .a/.so) заканчиваются, и мы добавляем эту папку в дополнительную папку, чтобы посмотреть в.

Если вы отправляете библиотеку в UNIX, общим местом обычно является /usr/lib (или /usr/local/lib), это также где gcc ищет по умолчанию.

В чем разница (технически и практически) между динамической и статической библиотекой?

Когда вы связываете программу со статическими библиотеками, код библиотек заканчивается в вашем исполняемом файле. Практически это делает ваш исполняемый файл более крупным и затрудняет обновление/исправление статической библиотеки по очевидным причинам (требуется новая версия исполняемого файла).

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

Также можно загружать разделяемые библиотеки без ссылки на них. Это требует больше работы, так как вам нужно вручную загрузить общую библиотеку и любой символ, который вы хотите использовать. В Windows это выполняется с помощью LoadLibrary/GetProcAddress и в системах POSIX с использованием dlsym/dlopen.

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

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

Простой пример для связывания со статической библиотекой foo будет выглядеть так: gcc main.cpp -o main.o -L/folder/where/foo.a/is/at -lfoo.

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

Ответ 3

Является ли запись [библиотеки] отличной от обычной программы на С++, минус функция main()?

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

Однако проектирование библиотек намного сложнее, потому что у вас нет контроля над кодом, который вызывает вас. Библиотеки должны быть более надежными в отношении отказа, чем обычный код. Вы не можете указать delete указатели, которые кто-то передает вашей функции. Вы не можете сказать, какие макросы будут возиться с вашим кодом. Вы также не можете случайно загрязнить глобальное пространство имен (например, не помещайте using namespace std в начало ваших файлов заголовков).

Как скомпилированная программа становится библиотекой? Это, очевидно, не исполняемый файл, поэтому как мне повернуть, скажем 'test.cpp' в 'test.dll'?

Это зависит от компилятора. В Visual С++ это настройка конфигурации проекта. В gcc (происходит из памяти) это что-то вроде gcc -c foo.c -shared.

Как только я получу его в своем формате, как включить его в другую программу?

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

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

Это зависит от операционной системы. В UNIX вы собираетесь размещать вещи в таких местах, как /usr/lib, /usr/local/lib. В Windows люди использовали DLL файлы в таких местах, как C:\WINDOWS, но это больше не разрешено. Вместо этого вы помещаете его в свой каталог программ.

В чем разница (технически и практически) между динамической и статической библиотекой?

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

Динамические библиотеки (также называемые совместно используемыми библиотеками) включают в себя компилятор, размещающий достаточную информацию в исполняемом файле, который во время выполнения компоновщик сможет найти правильные библиотеки и вызвать методы там. Библиотеки распределяются по всей системе среди программ, которые их используют. Использование динамической компоновки (dlsym(), et al.) Добавляет несколько деталей к изображению.

Как использовать сторонние библиотеки в моем коде (я смотрю на .dylib и .a файлы для MySql С++ Connector)

Это будет зависеть от вашей платформы, и, к сожалению, я не могу много рассказать о файлах .dylib..a файлы являются статическими библиотеками, и вам просто нужно добавить их в свой последний вызов gcc (gcc main.c foo.a -o main, если вы знаете, где foo.a, или gcc main.c -lfoo -o main, если система знает, где foo.a, foo.la), или foo.so). Как правило, вы убедитесь, что компилятор может найти библиотеку и оставить компоновщик для остальных.

Ответ 4

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

Чтобы использовать библиотеку, вы просто предоставляете -l в g++ для lib.a или lib.so

Ответ 5

Я пишу это, чтобы быть более прагматичным, чем технически правильным. Этого достаточно, чтобы дать вам общее представление о том, что вам нужно.

Записывает ли они какую-либо отличную от обычной программу на С++ минус функция main()?

Для статической библиотеки разница между ними действительно невелика.

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

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

Как скомпилированная программа становится библиотекой? Это, очевидно, не исполняемый файл, поэтому как мне повернуть, скажем 'test.cpp' в 'test.dll'?

Это похоже на то, как вы превращаете test.cpp в test.exe - компилируете и связываете. Вы передаете параметры компилятору, чтобы сообщить, создавать ли исполняемый файл, статическую библиотеку или динамическую библиотеку.

Как только я получу его в своем формате, как включить его в другую программу?

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

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

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

В чем разница (технически и практически) между динамической и статической библиотекой?

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

Динамическая библиотека остается в отдельном файле. Загружаемый файл загружает отдельный файл при его запуске. Вы должны распространять копию динамической библиотеки с вашей программой или она не будет работать. Вы также можете заменить динамическую библиотеку на новую версию, и пока новая библиотека имеет тот же интерфейс, она все равно будет работать со старым исполняемым файлом. Он также может сэкономить место, если в нескольких исполняемых файлах используется одна и та же динамическая библиотека. Фактически динамические библиотеки часто называют общими библиотеками.

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

То же, что и вы, используя тот, который вы создали, как описано выше.