Как я могу обработать DLL_EXPORT при компиляции DLL в статическую библиотеку? - PullRequest
3 голосов
/ 07 июня 2011

У меня есть проект в Visual C ++ 2010, который содержит директивы препроцессора в файле заголовка ключа.На самом деле это исходный код ZMQ.

Проект обычно настроен на dll, поэтому в заголовке используется состояние DLL_EXPORT (определено / не определено).Если проект используется для компиляции dll, заголовок может использоваться как проектом dll, так и клиентским кодом, благодаря следующей настройке, взятой из zmq.h:

#if defined _WIN32
#   if defined DLL_EXPORT
#       define ZMQ_EXPORT __declspec(dllexport)
#   else
#       define ZMQ_EXPORT __declspec(dllimport)
#   endif

Однако это неподдержать установку, где я собираю статическую библиотеку.Поэтому я должен изменить заголовок вручную.Visual Studio, похоже, распознает настройки проекта dll и соответственно обрабатывает определения для dll_export.Существует ли символ, распознаваемый Visual Studio, который соответствует настройке статической библиотеки?По сути, я бы хотел обрабатывать и использовать статическую библиотеку, расширив метод, использованный в приведенном выше фрагменте.

Ответы [ 2 ]

8 голосов
/ 07 июня 2011

Я бы просто ввел второй (необязательный) макрос, что-то вроде ZMQ_STATIC:

#if defined(ZMQ_STATIC)
#    define ZMQ_EXPORT
#elif defined(DLL_EXPORT)
#    define ZMQ_EXPORT __declspec(dllexport)
#else
#    define ZMQ_EXPORT __declspec(dllimport)
#endif

Определите указанный макрос как при сборке библиотеки в качестве статической библиотеки, так и при использовании ее в качестве статической библиотеки.

2 голосов
/ 07 июня 2011

__declspec(dllimport) совершенно необязательно.При сборке DLL компоновщик также создает статическую библиотеку импорта.

Если вы компилируете код клиента без __declspec(dllimport), он совместим либо с толстой статической библиотекой, либо со статической библиотекой импорта.Линкер все это выяснит.

Поэтому я предлагаю:

#   if defined DLL_EXPORT
#       define ZMQ_EXPORT __declspec(dllexport)
#   else
#       define ZMQ_EXPORT extern
#   endif

Как указывает @vanza, вам нужно исключить любой экспорт данных (вы можете просто обернутьих в функциях доступа).В любом случае вы должны сделать это, экспорт данных хрупок.


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

...