Как использовать несколько языков разработки - PullRequest
3 голосов
/ 25 ноября 2010

Я программирую на Delphi (D7 и D2006) на Windows XP (в ближайшем будущем перейду на Windows 7). Мне нужно использовать математическую библиотеку для некоторых работ, которые я выполняю, и большинство математических библиотек (которые я сейчас склоняю к Mathematica) создаст скомпилированный C-код. Такой код предоставит специфическую функциональность моим основным программам.

У меня есть очень простой вопрос - учитывая эту настройку разработки - как мне начать использовать скомпилированный код c из Delphi? Мне действительно нужны детские шаги, чтобы начать процесс.

Ответы [ 4 ]

4 голосов
/ 25 ноября 2010

Я сделал довольно много с моим продуктом FE OrcaFlex .У вас есть два варианта ссылки на ваш C-код из Delphi: статический или динамический.Я связываю статически, потому что это делает распространение и управление версиями намного проще.Но на самом деле это довольно хитрый прием, чтобы заставить его работать статически, и вам приходится полагаться на ряд недокументированных аспектов Delphi.

Я подозреваю, что для ваших нужд лучше всего использовать динамическое связывание.По сути, вам нужно скомпилировать и связать ваш код C в DLL.Я рекомендую использовать для этого компилятор Borland C.Вы можете использовать бесплатную версию командной строки BCC55 для этого.Преимущество использования Borland C состоит в том, что он делает те же самые предположения о модуле с плавающей запятой 8087, что и Delphi.Если вы будете строить с MSVC, то обнаружите, что MS решила не повышать исключения с плавающей запятой.Borland C поднимает исключения с плавающей точкой.Это небольшой случай, но он становится уместным, если вы пытаетесь отправить продукт, который вам нужен, чтобы быть надежным.

Вы должны знать, что код C по умолчанию будет использовать соглашение о вызовах Cи я бы просто придерживался этого.Вы вносите это в Delphi, объявляя внешнюю подпрограмму как соглашение о вызовах cdecl.

Еще одна вещь, о которой вам нужно позаботиться, это определить четкий интерфейс между двумя модулями.Вы должны убедиться, что исключения не пересекают границу модуля и не пропускают какие-либо специальные типы (например, строки Delphi) через границу.Поэтому для строки используйте PChar (или даже лучше PAnsiChar или PWideChar, чтобы быть уверенным, что он не изменит значения при обновлении до Delphi 2009 и более поздних версий).

3 голосов
/ 25 ноября 2010

Я очень доволен библиотекой SDL от Lohninger (http://www.lohninger.com/mathpack.html).. Она написана на Delphi и компилируется прямо в ваше приложение, поэтому нет проблем с объединением или соглашением о вызовах или различий в использовании с плавающей запятой, как обсуждалосьдругими ответами в этой теме.

Посмотрите, что он включает. Если вам повезет, его библиотека будет удовлетворять ваши потребности, и вы сможете ее использовать!

2 голосов
/ 26 ноября 2010

Вы можете смешать ваш проект с Delphi и C ++ (Builder) кодом, используя RAD Studio.Поместите автоматически созданный код C в файл C ++ Builder (.cpp), а для остальных добавьте файлы Delphi.

2 голосов
/ 25 ноября 2010

Если в настоящее время у вас установлен Mathematica, перейдите в центр документации и найдите guide/CLanguageInterface, в противном случае это руководство доступно в Интернете и прочитайте его там.

Насколько я понимаю,что Mathematica может генерировать C-программы, которые связываются с движком Mathematica через MathLink, если вам нужна полная функция или если вам нужны только низкоуровневые функции, тогда он способен генерировать код, который может быть статически связан с откомпилированными библиотеками Mathematica.Так что возможен автономный код.

См. Документацию Code Generator .

Если вы можете преобразовать программы на C в DLLs , то получите доступ ктакие внешние функции из Delphi относительно просты с внешними объявлениями.

function MathematicaRoutine(const x : double) : double; external 'MyInterface.dll';

При выполнении статического связывания неизбежно возникнет множество сложностей в его реализации., для использования там, где Mathematica не установлена, если это возможно.Я никогда не пытался это сделать.

...