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

В моих поисках для изучения C++ я столкнулся с динамическими и статическими библиотеками.

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

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

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

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

Спасибо!

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

22
задан Austin Hyde 22 January 2010 в 19:02
поделиться

5 ответов

пишут их любые отличные, чем обычная программа C ++, минус функции Main ()?

нет.

Как скомпилированная программа должна быть библиотекой? Это, очевидно, не исполняемый файл, так как я могу повернуть, сказать «TEST.CPP» в «TEST.DLL»?

пройти флаг -Dynamiclib , когда вы компилируете. (Имя результата по умолчанию по умолчанию AT . На Mac OS X вы должны назвать ваши динамические библиотеки как lib ***. Dylib , а на Linux lib ***. Итак (общие объекты))

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

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

Во-вторых, ссылка на ваш диэйлиб. Если ваш Дилиб назван как libblah.dylib , вы проходите флаг -LBLAH - GCC.

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

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

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

в основном, для статической библиотеки, вся библиотека встроена в файл «ссылки».

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

см. 3-й ответ.

19
ответ дан 29 November 2019 в 04:57
поделиться

пишут [библиотеки] любые отличающиеся, чем обычная программа C ++, минус функции MINUS ()?

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

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

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

, который зависит от компилятора. В Visual C ++ Это настройка конфигурации проекта. В GCC (шел от памяти) это что-то вроде GCC -C Foo.c -shared .

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

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

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

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

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

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

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

Как бы я использовал сторонние библиотеки в моем коде (я уставившись на файлы .dylib и .a для разъема mysql C ++)

, который будет зависеть от вашей платформы, и, к сожалению, я не могу вам сказать много о .dylib файлах. .a Файлы являются статическими библиотеками, и вам просто нужно добавить их в свой последний звонок в GCC ( GCC Main.C Foo.a -O Main Если вы знаете, где Foo.a IS, или GCC Main.c -lfoo -o main Если система знает где foo.a , foo.la , или foo.so . Как правило, вы убедитесь, что компилятор может найти библиотеку и оставить линкер для отдыха.

4
ответ дан 29 November 2019 в 04:57
поделиться

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

пишет их любые различные, чем обычная программа C ++, минус основной () функции?

для статической библиотеки, на самом деле не так много раз отличии.

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

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

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

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

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

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

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

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

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

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

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

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

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

1
ответ дан 29 November 2019 в 04:57
поделиться

Это невозможно без Runkit_function_Remove. Runkit - это расширение, предназначенное для того, чтобы делать такие вещи.

Вы уверены, что функция живет после завершения IF-Block? Я бы подумал, что если бы он был определен в формате IF-Block, что он станет недоступным позже.

-121--1573917-

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

Использовать библиотеку, которую вы просто предоставляете - L для G ++ для Lib.a или lib.so

1
ответ дан 29 November 2019 в 04:57
поделиться
- 4998435-

пишут их любые различные, чем обычная программа C ++, минус основной функции ()

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

* В классах / функциях GCC экспортируются по умолчанию - это не так в VC ++, там вы должны явно экспортировать, используя __ DECLSPEC (экспорт) .

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

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

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

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

В GCC вам нужно только указать библиотеку, которую вы ссылаетесь с использованием -LLIBRARY_NAME .

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

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

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

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

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

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

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

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

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

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

Простой пример к ссылке со статической библиотекой Foo будет выглядеть так: GCC Main.cpp-o Main.O -L / папка / где / foo.a / ins / at -lfoo .

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

12
ответ дан 29 November 2019 в 04:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: