Подавить создание библиотеки импорта - компоновщик Visual C ++ - PullRequest
4 голосов
/ 02 апреля 2012

Существует ли, возможно, недокументированный способ предотвратить создание компоновщиком IMPLIB для DLL или EXE, несмотря на наличие директив __declspec (dllexport) в исходном коде?

Указание no /IMPLIBв результате .LIB создается с именем по умолчанию.

Это важно, когда директивы declspec поступают из стороннего кода, который не находится под контролем.Это, например, случай с boost::serialization.Возможное решение - это способ «объявить» экспорт DLL.Файл DEF также не может это сделать (AFAIK), поскольку он может только добавлять в список экспорта, но не удалять из него.

Ответы [ 4 ]

2 голосов
/ 05 марта 2013

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

См. на этой странице MSDN для получения дополнительной информации о синтаксисе файла MSVC .def.

2 голосов
/ 04 марта 2013

Нет никакого способа сделать это с опцией компоновщика, использование / implib: «nul» с треском проваливается, когда компоновщик использует его для именования файла .exp. Наиболее практичным решением является удаление файлов снова после сборки. Проект + Свойства, События сборки, Событие после сборки и вставка:

del $(TargetDir)$(TargetName).lib
del $(TargetDir)$(TargetName).exp

enter image description here

2 голосов
/ 03 апреля 2012

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

1 голос
/ 03 марта 2013

Многие сторонние коды не используют __declspec(dllexport) напрямую, но скрывают его под макросом, чтобы контролировать его. Обычно они хотят переключаться между dllexport и dllimport в зависимости от того, куда включен файл заголовка (внутри реализации dll или пользователем dll)

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

Например, boost::serialization проверьте config.hpp и посмотрите, как вы можете им управлять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...