Lib без Dll - бывают разные типы Lib?
От: Shmj Ниоткуда  
Дата: 06.11.22 11:30
Оценка: :))) :)))
Такой вопрос.

Понадобилось вызвать из C-проекта стороннюю функцию из внешней библиотеки. Мне понадобился и .h-файл и .lib-файл — все это на уровне компиляции. А на уровне исполнения еще и затребовало .dll-файл, что меня несколько обескуражило. Я думал что .lib — это аналог .dll, только всю магию делает на этапе компиляции. Потом почитал тут объяснение и понял что .lib просто вспомогательная штуковина, которую можно сгенерить на основе .dll, ну можно сказать легаси некий.

Вроде все, но нет. Попробовал в студии создать типы проектов Dynamic Library и Static Library. Для первого получают только dll без lib, для второго только lib без dll. И тут мой мир обрушился — получается таки можно lib включать без dll? Получается что бывают разные типы lib?

Ну и второй вопрос. Коль скоро для C++ проектов при подключении dll желательно иметь h-файл и .lib -файл, то почему тип проекта Dynamic Library по умолчанию не генерит этот .lib файл.
Re: Lib без Dll - бывают разные типы Lib?
От: Stanislav V. Zudin Россия  
Дата: 06.11.22 11:47
Оценка: 12 (2)
Здравствуйте, Shmj, Вы писали:

S>Ну и второй вопрос. Коль скоро для C++ проектов при подключении dll желательно иметь h-файл и .lib -файл, то почему тип проекта Dynamic Library по умолчанию не генерит этот .lib файл.


Почему же, ещё как генерит, просто разберись, куда он его складывает и есть ли в твоей длл экспортируемые функции.
Для DLL lib файл это просто инструкция линковщику, откуда брать функцию. А статическая lib — это собсно код функции.

DLL ты можешь подключить без либ-файла через поиск адреса функции. LoadLibrary() + GetProcAddress().
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: Lib без Dll - бывают разные типы Lib?
От: Shmj Ниоткуда  
Дата: 06.11.22 12:14
Оценка: +1
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Почему же, ещё как генерит, просто разберись, куда он его складывает и есть ли в твоей длл экспортируемые функции.


Точно, добавил одну функцию — появилась lib. Для пустого проекта не создавало.
Re: Lib без Dll - бывают разные типы Lib?
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.11.22 22:14
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Понадобилось вызвать из C-проекта стороннюю функцию из внешней библиотеки. Мне понадобился и .h-файл и .lib-файл — все это на уровне компиляции. А на уровне исполнения еще и затребовало .dll-файл, что меня несколько обескуражило. Я думал что .lib — это аналог .dll, только всю магию делает на этапе компиляции. Потом почитал тут объяснение и понял что .lib просто вспомогательная штуковина, которую можно сгенерить на основе .dll, ну можно сказать легаси некий.


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

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

Чтобы собрать программу, которая автоматически использует символы из .dll, нужна так называемая import library. Она содержит не реализации функций, а только затычки, переходы на реальные функции подставляются уже при запуске программы, динамическим загрузчиком, автоматически.

Кстати, gcc умеет собирать программы с динамическими библиотеками и без помощи import library. Но это несколько медленнее, потому, что в .lib есть всякие удобства для быстрого поиска символов по имени, а в .dll — нет. Микрософтовские компиляторы так не умеют.

Import library может быть сгенерировано из .dll, но название соответствующей тулзы навскидку не скажу, давно уж вендой совсем никак не занимаюсь.
Re: Lib без Dll - бывают разные типы Lib?
От: Bill Baklushi СССР  
Дата: 07.11.22 22:25
Оценка:
Shmj:

S>Вроде все, но нет. Попробовал в студии создать типы проектов Dynamic Library и Static Library. Для первого получают только dll без lib, для второго только lib без dll. И тут мой мир обрушился — получается таки можно lib включать без dll? Получается что бывают разные типы lib?

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

S>Ну и второй вопрос. Коль скоро для C++ проектов при подключении dll желательно иметь h-файл и .lib -файл, то почему тип проекта Dynamic Library по умолчанию не генерит этот .lib файл.

Насколько помню, это можно как-то включить в настройках Librarian-а.
Модератор-националист Kerk преследует оппонентов по политическим мотивам.
Re: Lib без Dll - бывают разные типы Lib?
От: velkin Удмуртия http://blogs.rsdn.org/effective/
Дата: 07.11.22 23:26
Оценка: 6 (1)

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


Здравствуйте, Shmj, Вы писали:

S>>Потом почитал тут объяснение и понял что .lib просто вспомогательная штуковина, которую можно сгенерить на основе .dll, ну можно сказать легаси некий.


Библиотека (программирование)

Типы библиотек алгоритмов с точки зрения линковки.
1. *.dll и *.so динамические библиотеки.
2. *.lib и *.a статические библиотеки.

Разные компиляторы.
1. Если используешь компиляторы майкрософт, то будет набор dll и lib.
2. А если GCC, тогда *.so и *.a.

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


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

Будут следующие файлы.
программа.exe библиотека1.dll библиотека2.dll

Или так
программа библиотека1.so библиотека2.so

В винде можешь воспользоваться.
https://www.dependencywalker.com/

Dependency Walker входит в состав Visual Studio.

А в гну линуксе есть команда ldd.

Статическая линковка библиотек


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

Получится так.
программа.exe

Или так
программа

Пересборка библиотек из исходников


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

У виндузятников обычно принято давать скачивать релизы динамических библиотек. Как только появится мысль, "как слинковать проект статически", тогда придётся пересобрать не только проект, но и все зависимости, ибо нужного статического релиза объектного кода библиотек скорее всего не будет.

Так то я даже Qt4 статически собирал в MinGW. Мне думается, если нужен релиз со статической линковкой, то просто собирай и по ходу дела разберёшься. Тем более там всё зависит от компиляторов. Можно заодно и в динамической линковке потренироваться не оглядываясь на официальные релизы объектного кода.
Re[2]: Lib без Dll - бывают разные типы Lib?
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 08.11.22 07:00
Оценка:
Здравствуйте, velkin, Вы писали:

V>Статические и динамические библиотеки


Что-то ты в этот раз не полно ответил.

1. Статическая линковка: просто lib

2. Динамическая линковка: dll/so
2.1. Статическое связывание на этапе сборки: lib/a + dll/so
2.1.1. Статическое связывание с отложенной загрузкой в Windows: /DELAYLOAD

2.2. Динамическое связывание в runtime: просто dll/so и LoadLibrary+GetProcAddress / dlopen+dlsym (или boost.dll)
Re[3]: Lib без Dll - бывают разные типы Lib?
От: Stanislav V. Zudin Россия  
Дата: 08.11.22 07:20
Оценка: +3
Здравствуйте, Nuzhny, Вы писали:

V>>Статические и динамические библиотеки


N>Что-то ты в этот раз не полно ответил.


"...а ещё ты свечки забыл..." а ещё забыл упомянуть про рантайм статический/динамический. Потому что тут эта проблема этот нюанс проявляется в полный рост.
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: Lib без Dll - бывают разные типы Lib?
От: CreatorCray  
Дата: 08.11.22 10:10
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Import library может быть сгенерировано из .dll, но название соответствующей тулзы навскидку не скажу, давно уж вендой совсем никак не занимаюсь.

Да её и вручную сгенерить не проблема, тупо .с файл с definitions + .def скомпилить в либу
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.