может ли библиотека содержать несколько привязок - PullRequest
0 голосов
/ 22 октября 2011

если бы я написал библиотеку на C ++ и имел привязки для C, Ada, Fortran, D и других скомпилированных языков.

могли бы все эти привязки быть в одном бинарном скомпилированном коде C ++, даже если они используют одинаковыеимена функций?

и не могли бы вы использовать такие привязки?

Ответы [ 3 ]

1 голос
/ 22 октября 2011

В зависимости от того, как вы создаете свои привязки, библиотека может даже не понадобиться:

  • Привязки, написанные для некоторых специфичных для интерпретатора API:

Например, расширения ruby, написанные с использованиемMRI API - это, по сути, разделяемая библиотека, обеспечивающая:

void init_Modulename()

Затем эта функция использует API-интерфейсы MRI, такие как rb_define_module, rb_define_class, rb_define_method и т. Д., Чтобы обернуть API C / C ++.Убедитесь, что эта функция окружена внешним символом «C», поэтому ее имя не искажается способом C ++.

Обычно эта разделяемая библиотека связывается с библиотекой, которую вы привязываете, но ничто не мешает им быть одинаковымиразделяемая библиотека.

  • Привязки выполняются во время выполнения

Например, привязки с использованием FFI на Ruby и других интерпретаторов.Привязки определяются на одном языке, и именно библиотека FFI знает, как вызывать методы в целевой библиотеке во время выполнения.Поэтому в этом случае сами привязки не имеют «библиотеки».

  • Связывания выполняются с генераторами

Если вы используете генератор, такой как SWIG, он будет сканировать заголовки библиотекии генерировать привязки для разных языков.В зависимости от того, как эти цели реализованы генератором SWIG (например, для Ruby используется API-интерфейс MRI, описанный выше), SWIG создаст код, который вы можете скомпилировать в свою собственную библиотеку, но если у вас нет конфликтов символов, выможет также скомпилировать это вместе с вашей библиотекой.

Когда я имею в виду конфликты символов, я имею в виду не сам API, а помощники привязки, такие как init_Modulename ().

1 голос
/ 22 октября 2011

Да. Пример (слегка перевернутый): PlPlot ; он написан на C и имеет привязки к Ada, C ++, D, Fortran77, Fortran95, Java, Lua, OCaml, Python, ...

1 голос
/ 22 октября 2011

Вы можете связать C ++ с C, при условии, что вы вызываете только функции стиля C (вне объектов) и отключили искажение имени в заголовке через "extern C".Особенно, если вы используете один и тот же компилятор.Различные компиляторы будут вызывать проблемы, если они используют разные форматы obj.Я не знаю об ADA / Fortran / D, но подозреваю, что ответ будет отрицательным, по крайней мере, напрямую через файлы .LIB или .OBJ.В Windows вы можете попробовать через DLL, если ADA / FORTRAN / D поддерживает динамическое связывание (или вы можете вызвать windows api LoadLibrary).

Это нелегко сделать, и я замял детали.Если вы действительно собираетесь попробовать, то вам нужно будет конкретно указать, какие платформы и компиляторы вы используете, и я постараюсь быть более конкретным.

...