Yoksel: Блог/2008?/07?/13?/СовместноеИспользованиеOCamlиCppВСтудии2005 ...
SourceForge.net Logo

Home Page | Изменения / НовыеКомментарии / Справка / Помочь проекту | Вход:  Пароль:  

Блог OCaml?

Совместное использование компонентов на O'Caml и на C++ в Студии 2005


У O'Caml есть возможности по взаимодействию с программами на C. Отсюда появляются возможности использовать функции O'Caml в программах на C++. Рассмотрим примерный способ, как это можно организовать.


Я использую оптимизированный компилятор O'Caml в машинный код – ocamlopt.opt.exe. Далее везде я имею в виду именно его. Компилятор в байт-код я не рассматриваю.

Модель сборки

Согласно документации компиляция ml-файлов для использования в программах на C состоит из двух этапов:

на этом этапе создаются файлы cmi, cmx и obj для каждого файла ml.


Полученный объектный файл уже непосредственно линкуется к конечной программе на C / C?++.

Создание Custom Build Rule

Custom Build Rule определяет правило сборки файлов определенного типа. Один раз создав правило сборки, мы получаем возможность его использовать для каждого добавленного в проект файла заданного типа. При этом нет необходимости для каждого файла описывать команду сборки. К сожалению мне удалось создать правило сборки только для первого этапа сборки: для генерации промежуточных объектных файлов на основе исходников. Файл с правилами можно скачать в разделе «Файлы» этой страницы. В данном файле также есть правило для сборки cmx-файлов. Однако это правило работает только в случае, когда cmx-файлы вручную включаешь в проект. А этого хотелось бы избежать. В будущем я постараюсь автоматизировать второй этап сборки.

Настройки проекта

Я использую компилятор Intel C++. Интеграция этого компилятора в Студию 2005, к сожалению, не поддерживает “Custom Build Rules”. Поэтому приходится использовать обходной путь: специально для файлов O'Caml создается вспомогательный проект для сборки «Static Library (.lib)". Основной проект на C++ делается зависимым от этой библиотеки.


Для основного C++ проекта в настройках линкера надо добавить в дополнительные зависимости библиотеку libasmrun.lib и поставить в игнор LIBCMT.lib. Или можно «просто» пересобрать рантайм-библиотеку O'Caml с опцией использования динамической CRT.

Вызов кода O'Caml из кода на C++

Подобные вызовы хорошо описаны в документации и нормально работают в программе на C++ с небольшими поправками. В частности, мне удалось наладить нормальное взаимодействие с O'Caml из обычного MFC-приложения. Выглядит это, примерно, так:

Обязательно надо использовать extern “C”. Иначе при линковке будут ошибки.



Код со стороны O'Caml выглядит следующим образом:


Данный код нормально запускается и работает как ожидается.


Ссылок на эту страницу нет


 
Один файл. [Показать файлы/форму]
Комментариев нет. [Показать комментарии/форму]