Экспорт общих библиотечных символов в кроссплатформенном виде? - PullRequest
3 голосов
/ 06 октября 2009

Существует ли кроссплатформенный способ выборочного экспорта определенных функций и структур из проекта C, который создает общую библиотеку?

Я хочу сделать так, чтобы не требовалась конкретная система сборки (видимость должна быть определена в коде, например, как макрос), и способом, понятным для GCC и MSVC.

Спасибо.

1 Ответ

4 голосов
/ 07 октября 2009

Строго нет, конечно, потому что наборы инструментов не одинаковы.

Но люди делают это. Сложности в том, что в окнах нужно специально пометьте объявления функций, из которых вы хотите экспортировать DLL с __declspec(dllexport) в месте в библиотеке, где функция определена и __declspec(dllimport) в местах в коде клиента, где функция ссылается . Потому что стандарт Практика C имеет только одно объявление в одном заголовочном файле, это означает, что вам, как правило, нужно выполнить некоторую макроработу, чтобы Префикс, который работает в обоих местах. Кажется, что каждый проект выбирает свой собственный стандарт для этого.

На стороне Unix вам вообще не нужно тегировать экспорт, что приятно. Это связано с тем, что каждая нестатическая функция экспортируется по умолчанию, что не так приятно. Часто вы можете сойти с рук до тех пор, пока Ваши непубличные / нестатические символы имеют вменяемые префиксы, вот что большинство проектов, кажется, делают. Если вам нужен более точный контроль над экспортированные символы, вы можете использовать "mapfile" в стиле Solaris с GNU Аргумент компоновщика --version-script (-M под Solaris), чтобы явно указать, какие символы должны появляться во внешнем пространстве имен.

Есть еще несколько ошибок между платформами, например, как глобальное пространство имен для каждой библиотеки работает и обрабатывает код запуска / выключения. По сути, это крысиное гнездо, которое не может быть разумно объяснил в этом коротком посте, но пока вы осторожны что ваша библиотека содержит простые функции, а ваше пространство имен - нет загрязнять, у вас не должно быть особых проблем. Посмотрите на некоторые из более популярные кросс-платформенные разделяемые библиотеки (например, Qt, Glib / Gtk +, что угодно распространяется с помощью msys и т. д.) для руководства.

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