Блог OCamlСовместное использование компонентов на O'Caml и на C++ в Студии 2005
У O'Caml есть возможности по взаимодействию с программами на C. Отсюда появляются возможности использовать функции O'Caml в программах на C++. Рассмотрим примерный способ, как это можно организовать.
Я использую оптимизированный компилятор O'Caml в машинный код – ocamlopt.opt.exe. Далее везде я имею в виду именно его. Компилятор в байт-код я не рассматриваю.
Модель сборки
Согласно документации компиляция ml-файлов для использования в программах на C состоит из двух этапов:
- компиляция ml-файлов в промежуточные объектные файлы:
на этом этапе создаются файлы cmi, cmx и obj для каждого файла ml.
- генерация конечного объектного файла на основе предыдущих объектных файлов. Данный объектный файл должен быть ОДИН – он содержит код всех промежуточных объектников, рантайм и стартап код для кода O'Caml. Команда для сборки:
Полученный объектный файл уже непосредственно линкуется к конечной программе на 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-приложения. Выглядит это, примерно, так:
- Подключение заголовков O'Caml:
Обязательно надо использовать extern C. Иначе при линковке будут ошибки.
- Инициализация рантайма O'Caml в коде CWinApp::InitInstance:
- Вызов «замыкания» O'Caml:
Код со стороны O'Caml выглядит следующим образом:
Данный код нормально запускается и работает как ожидается.
Ссылок на эту страницу нет