#c #c #binary #ada
#c #c #двоичный #ada
Вопрос:
если я написал библиотеку на C и имею привязки для C, Ada, Fortran, D
amp; других скомпилированных языков.
могут ли все эти привязки находиться в одном двоичном коде с скомпилированным кодом C , даже если они используют одни и те же имена функций?
и не могли бы вы использовать такие привязки?
Комментарии:
1. Вероятно, нет, но я на самом деле не знаю.
Ответ №1:
В зависимости от того, как вы создаете свои привязки, библиотека может быть даже не нужна:
- Привязки написаны для некоторых API-интерфейсов, специфичных для интерпретатора:
Например, расширения ruby, написанные с использованием MRI API, в основном представляют собой общую библиотеку, предоставляющую:
void init_Modulename()
Затем эта функция использует MRI api, такие как rb_define_module, rb_define_class, rb_define_method и т. Д., Чтобы обернуть API-интерфейсы C / C . Убедитесь, что эта функция окружена внешним символом «C», чтобы ее имя не искажалось способом C .
Обычно эта разделяемая библиотека связана с библиотекой, которую вы привязываете, но ничто не мешает тому, что это одна и та же разделяемая библиотека.
- Привязки, выполняемые во время выполнения
Например, привязки с использованием FFI на Ruby и других интерпретаторах. Привязки определяются на одном языке, и именно библиотека FFI знает, как вызывать методы в целевой библиотеке во время выполнения. Поэтому в этом случае сами привязки не имеют «библиотеки».
- Привязки выполняются с помощью генераторов
Если вы используете генератор, например SWIG, он будет сканировать заголовки библиотеки и генерировать привязки для разных языков. В зависимости от того, как эти цели реализуются генератором SWIG (например, для Ruby использует MRI API, описанный выше), SWIG создаст код, который вы можете скомпилировать в свою собственную библиотеку, но пока у вас нет конфликтов символов, вы также можете скомпилировать это вместе со своей библиотекой.
Когда я имею в виду конфликты символов, я имею в виду не сам API, а помощников привязки, таких как init_Modulename() .
Ответ №2:
Вы можете связать C с C, при условии, что вы вызываете только функции в стиле C (вне объектов) и отключили искажение имен в заголовке через «extern C». Особенно, если вы используете тот же компилятор. Разные компиляторы могут вызвать проблемы, если они используют разные форматы obj. Я не знаю насчет ADA / Fortran / D, но я подозреваю, что ответ будет отрицательным, по крайней мере, напрямую через .Библиотека или .OBJ-файлы. В Windows вы можете попробовать использовать DLL, если ADA / FORTRAN / D поддерживает динамическое связывание (или вы можете вызвать Windows api LoadLibrary).
Это непросто сделать, и я умолчал о деталях. Если вы действительно собираетесь попробовать, то вам нужно будет уточнить, какие платформы и компиляторы вы используете, и я постараюсь быть более конкретным.
Ответ №3:
ДА. Примером (слегка перевернутым) является PLplot; он написан на C и имеет привязки к Ada, C , D, Fortran77, Fortran95, Java, Lua, OCaml, Python, …