У O'Caml есть возможности по взаимодействию с программами на C. Отсюда появляются возможности использовать функции O'Caml в программах на C++. Рассмотрим примерный способ, как это можно организовать.
Я использую оптимизированный компилятор O'Caml в машинный код – ocamlopt.opt.exe. Далее везде я имею в виду именно его. Компилятор в байт-код я не рассматриваю.
Согласно документации компиляция ml-файлов для использования в программах на C состоит из двух этапов:
Полученный объектный файл уже непосредственно линкуется к конечной программе на C / C?++.
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.
Подобные вызовы хорошо описаны в документации и нормально работают в программе на C++ с небольшими поправками. В частности, мне удалось наладить нормальное взаимодействие с O'Caml из обычного MFC-приложения. Выглядит это, примерно, так:
Код со стороны O'Caml выглядит следующим образом:
Данный код нормально запускается и работает как ожидается.
Ссылок на эту страницу нет