2009-10-06 3 views
3

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

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

спасибо.

+0

... копировать/вставить? – pmg

+0

проверьте это: http://stackoverflow.com/questions/2164827/explicitly-exporting-shared-library-functions-in-linux –

ответ

4

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

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

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

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

Смежные вопросы