Обычно, если вы хотите использовать declspec в кроссплатформенных сборках, вы получите что-то в этом роде, учитывая проект ABC
:
Проект Windows, выполняющий экспорт, объявляет так же во время dllbuilds:
#define ABC_EXPORT
Все не-Windows проекты или проекты, которые планируют взаимодействовать с lib-версией проекта (и lib-версией самого проекта), объявляют:
#define ABC_LIB
тогда у вас есть в вашем проекте:
#ifdef ABC_LIB //or #if (defined(ABC_LIB) || !defined(WIN32))
#define ABC_API
#else
#ifdef ABC_EXPORT
#define ABC_API __declspec(dllexport)
#else
#define ABC_API __declspec(dllimport)
#endif
#endif
Тогда все ваши функции объявлены следующим образом:
ABC_API void foo();
Еще лучше, если у вас есть уровень абстракции ОС, вы можете использовать другой #define
вместо __declspec
для полной гарантии того, что сборки POSIX никогда не должны беспокоиться об этом.
Я настоятельно рекомендую вместо этого использовать экспортные файлы, потому что это не весело.