C++. Сборник рецептов | страница 31
>__declspec(dllexport)
.GCC отличается от других инструментов для Windows и еще в одном: вместо того чтобы передавать компоновщику библиотеку импорта, связанную с DLL, вы можете передать саму DLL. Это обычно быстрее, чем использование библиотеки импорта. Однако это может привести к проблемам, так как в одной и той же системе может существовать несколько версий одной DLL, и вы должны быть уверены, что компоновщик выберет правильную версию. В табл. 1.11 при демонстрации того, как создавать библиотеки импорта с помощью GCC, я решил не использовать эту возможность.
Последние версии GCC на некоторых платформах, включая Linux и Mac OS X, дают программистам возможность более тонкого управления экспортом символов из динамических библиотек: опция командной строки -fvisibility используется для указания видимости символов динамической библиотеки по умолчанию, а специальный атрибут, аналогичный >__declspec(dllexport)
в Windows, используется в исходном коде для изменения видимости символов по отдельности. Опция >-fvisibility
имеет несколько различных значений, но два наиболее интересных — это default и hidden. Грубо говоря, видимость default означает, что символ доступен для кода других модулей, а видимость hidden означает, что не доступен. Чтобы включить выборочный экспорт символов, укажите в командной строке -fvisibility=hidden и используйте атрибут visibility (видимость) для пометки символов как видимых, как показано в примере 1.7.
Пример 1.7. Использование атрибута visibility с опцией командной строки -fvisibility=hidden
>extern __attribute__((visibility("default"))) int m; // экспортируется
>extern int n; // не экспортируется
>__attribute__((visibility("default"))) void f(); // экспортируется
>void g(); // не экспортируется
>struct __attribute__((visibility("default"))) S { }; // экспортируется
>struct T { }; //не экспортируется
В примере 1.7 атрибут >__attribute__((visibility("default")))
играет ту же роль, что и >__declspec(dllexport)
в коде Windows.
Использование атрибута