Никаких дополнительных зависимостей не требуется для LIB, но требуется для DLL - PullRequest
2 голосов
/ 11 сентября 2010

У меня есть фреймворк (на C ++), который зависит от нескольких сторонних библиотек. Когда я компилирую статическую версию library framework, никаких дополнительных зависимостей не требуется, то есть файлы lib библиотек третьей части не нужны. Когда я компилирую ту же платформу, что и DLL, теперь нужны дополнительные зависимости, иначе я получаю ошибки компоновки. Я могу догадаться, почему это происходит, но хотел бы получить конкретный ответ / объяснение, чтобы понять, что происходит.

РЕДАКТИРОВАТЬ: Просто чтобы прояснить, я разрабатываю каркас, который может быть скомпилирован как lib и как dll и тогда используется в (n) ( исполняемый) проект. При компиляции фреймворка как lib и использовании функций из сторонней библиотеки мне не нужны дополнительные зависимости. Однако проект, который теперь использует файл lib (который является структурой), должен включать файлы lib сторонних производителей. Когда я компилирую фреймворк как dll, он дает мне ошибки компоновки, если я не укажу библиотеки 3-й части, от которых фреймворк технически зависит. Например: у меня есть несколько классов, которые вызывают функциональность из Ogre3D. Эти классы скомпилированы как lib файл. Мне не нужно ссылаться на OgreMain.lib при компиляции lib классов. С другой стороны, когда я компилирую dll версию тех же классов, мне нужно сделать ссылку на OgreMain.lib

Ответы [ 4 ]

3 голосов
/ 11 сентября 2010

Если у вас есть статическая библиотека (файл .lib), которая представляет собой просто набор из одного или нескольких объектных файлов (.obj), компоновщик просто добавляет этот код к вашему в одном исполняемом файле. Вы можете сказать компоновщику сделать это с помощью переключателя командной строки, параметра конфигурации IDE или, возможно, даже #pragma (особенности зависят от вашей среды и компилятора).

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

Существуют и другие способы обработки ссылок DLL (например, файлы .def или операторы #using в .NET), но, похоже, это то, о чем вы говорите.


Отвечая на ваше уточнение вопроса:

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

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

Я говорю немного неточно, но вы поняли.

0 голосов
/ 12 сентября 2010

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

0 голосов
/ 11 сентября 2010

Когда вы ссылаетесь на LIB, он добавляет все символы / функции, которые вы фактически используете, в ваш исполняемый файл. Те, которые вы не используете, не будут добавлены. При ссылке на dll - весь код из внешней библиотеки загружается. Если этот дополнительный код (код, который вы не используете) зависит от большего количества внешних библиотек, вам также необходимо предоставить их.

Один пример: вы хотите использовать класс ip из сетевой библиотеки. Класс ip не зависит от других библиотек. Другие функции в сетевой библиотеке зависят от других внешних библиотек. Если вы связываете сетевую библиотеку как LIB, вы просто связываете класс ip -> вам не нужны другие библиотеки, так как другой код не будет связан. Когда вы используете DLL, весь код в dll должен быть создан -> поэтому вам нужно будет предоставить другие внешние библиотеки.

0 голосов
/ 11 сентября 2010

Статическая библиотека может включать другие статические библиотеки, предоставляя одну библиотеку для связи

DLL может включать статические библиотеки, предоставляя одну DLL для ссылки.

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

...