C++. Сборник рецептов | страница 32
>__declspec(dllexport)
и >__declspec(dllimport)
, так как вам требуется, чтобы этот атрибут присутствовал при сборке общей библиотеки и отсутствовал при компиляции кода, использующего эту общую библиотеку, и чтобы он полностью отсутствовал на платформах, его не поддерживающих. Как и в случае с >__declspec(dllexport)
и >__declspec(dllimport)
, эта проблема решается с помощью препроцессора. Например, вы можете изменить заголовочный файл georgeringo.hpp из примера 1.2 так, чтобы использовать атрибут видимости, следующим образом.georgeringo/georgeringo.hpp
>#ifndef GEORGERINGO_HPP_INCLUDED
>#define GEORGERINGO_HPP_INCLUDED
>// определите GEORGERINGO_DLL при сборке libgeorgeringo
>#if defined(_WIN32) && !defined(__GNUC__)
>#ifdef GEORGERINGO_DLL
>#define GEORGERINGO_DECL __declspec(dllexport)
>#else
>#define GEORGERINGO_DECL __declspec(dllimport)
>#endif
>#else // Unix
># if defined(GEORGERINGO_DLL) && defined(HAS_GCC_VISIBILITY)
># define GEORGERINGO_DECL __attribute__((visibility("default")))
># else
>#define GEORGERINGO_DECL
>#endif
># endif
>// Печатает "George, and Ringo\n"
>GEORGERINGO_DECL void georgeringo();
>#endif // GEORGERINGO_HPP_INCLUDED
Чтобы заставить это работать, вы должны при сборке в системах, поддерживающих опцию -fvisibility, определить макрос >HAS_GCC_VISIBILITY
.
Metrowerks для Mac OS X предоставляет несколько опций для экспорта символов из динамической библиотеки. При использовании IDE CodeWarrior вы можете использовать файл экспорта символов, который играет роль файла .def в Windows. Вы также можете экспортировать все символы с помощью опции -export all, что при сборке из командной строки является поведением по умолчанию. Я рекомендую метод, использующий для пометки в вашем исходном коде экспортируемых функций >#pragma export
, и указание в командной строке -export pragma при сборке динамической библиотеки. Использование >#pragma export
иллюстрируется в примере 1.2: просто вызовите >#pragma export on
в ваших заголовочных файлах сразу перед группой функций, которые требуется экспортировать, а сразу после нее — >#pragma export off
. Если вы хотите, чтобы ваш код работал с инструментарием, отличным от Metrowerks, вы должны поместить обращения к >#pragma export
между директивами >#ifdef
/>#endif
, как показано в примере 1.2.