Статическая библиотека с зависимостями - PullRequest
7 голосов
/ 10 января 2011

e.exe связан с моей пользовательской статической библиотекой c.lib, которая использует Win32 API, определенный в w.dll.w.dll находится в C: \ Windows \ System32, а его библиотека импорта - w.lib, находится в каталоге Windows SDK.Оболочка w.lib указана как Дополнительная зависимость в c.lib или e.exe проекте?(e.exe строит успешно в обоих случаях.) Какова лучшая практика и почему?Я думаю, e.exe не должен знать о w.lib.

c.lib предназначен для совместного использования только группой разработчиков (не для отправки клиентам).

TEST : я использовал VS2008 и утилиту dumpbin дляпротестируйте оба случая, и вот результаты:

  • Случай 1: w.lib добавлено как Дополнительная зависимость в c.lib проекте.

dumpbin /archivemembers c.lib output выводит оба смещения в файлах w.dll и .obj из проекта c.lib в качестве членов архива.

  • Случай 2: w.lib не добавляется как Дополнительная зависимость в c.lib, но в e.exe проекте:

На этот раз вывод дампа содержит только файлы .obj c.lib, а размер c.lib меньше, чем в случае 1

(c.lib был добавлен как Дополнительная зависимость в w.exe проекте в обоих случаях.)

ПРИМЕЧАНИЕ : я использовал w.lib и w.dll здеськак вымышленные, общие имена для библиотек Windows, но они могут быть, например, Userenv.lib и Userenv.dll или Version.lib и Version.dll ...

Ответы [ 2 ]

1 голос
/ 10 января 2011

Я думаю, вы не понимаете, что делает создание архива и архива импорта.

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

Процесс создания c.lib из w.lib просто извлекает объекты w.lib и добавляет их в коллекцию объектов в c.lib. По сути, c.lib становится библиотекой импорта + кодом.

Думаю, ты должен это сделать? Не совсем - это может привести к путанице относительно того, от чего зависит e.exe; Я думаю, вы должны явно сделать это видимым, а не пытаться скрыть это. Тем не менее, это только рекомендация, а не правило.

0 голосов
/ 10 января 2011

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

В основном .lib "копируется" в ваш exe во время компоновки.

Если вы хотите, чтобы ваши пользователи не связывались с explicity, то снова ссылаются на w.lib, преобразуют c.lib в dll, dll связаны, и вам не нужны их зависимости во время сборки.

...