Вызвать код C / C ++ из программы fortran в Visual Studio? (Как скомпилировать смешанный код C и fortran в Visual Studio)

Я ищу способ интегрировать код C ++ с кодом fortran (я хочу просто вызвать некоторые функции C / C ++ в коде fortran).

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

В то время я думаю о создании кода на C ++ в форме dll и вызове его из кода Fortran.

Кто-то уже видел решение? Или как насчет накладных расходов на вызов функции из dll? Мой код fortran переносит много памяти в функцию C, есть ли проблемы, если бы я решил эту проблему с помощью dll?

Спасибо.

PS Я использую компиляторы Visual Studio 2008 Prof и Intel 10.

PPS Я думаю, мне нужно указать более конкретно, что я хочу: я хочу скомпилировать проект fortran в Visual Studio, который использует некоторые функции C.


person LonliLokli    schedule 28.06.2010    source источник
comment
Нет языка C / C ++. Я считаю, что в данном случае эта путаница напрямую усугубляет ваши проблемы.   -  person MSalters    schedule 29.06.2010
comment
Я знаю разницу между c и c ++ в контексте вызова кода из fortran. Я ищу способ интегрировать 2 проекта в Visual Studio. Один на Фортране, а другой на C или C ++. Поэтому я использую запутанное выражение C / C ++.   -  person LonliLokli    schedule 29.06.2010


Ответы (6)


Есть новый способ сделать это, который имеет много преимуществ - использовать привязку Fortran 2003 ISO C. Это стандартный и поэтому в значительной степени независимый от ОС и языка способ взаимодействия Fortran и C (и любого языка, который будет использовать соглашения о вызовах C). Intel Fortran 11 поддерживает множество других компиляторов - не уверен насчет версии 10. Используя привязку ISO C, вы можете сопоставить любое имя C (в любом случае), не беспокоиться о подчеркивании (и различиях между компиляторами) и можете укажите типы и методы вызова (по ссылке, по значению) для аргументов. Intel предоставляет несколько примеров в папке со своим компилятором; есть также примеры в руководстве по gfortran и обсуждение дополнительных соображений для Windows. Здесь и на форуме Intel Fortran есть предыдущие вопросы и ответы.

person M. S. B.    schedule 28.06.2010
comment
Моя проблема сейчас состоит в том, чтобы интегрировать мой c ++ в существующий проект Fortran в Visual Studio 2008. Есть ли учебник, как это сделать? - person LonliLokli; 29.06.2010
comment
@LonliLokli - У меня нет VS на машине, с которой я пишу это, но разве нет в справке fortran чего-нибудь о смешанном программировании. Я уверен, что когда-то видел это. - person Rook; 29.06.2010
comment
Кроме того, что сказал MSB. - person Rook; 29.06.2010
comment
Несколько советов по Intel Fortran и Visual Studio можно найти по адресу software.intel.com/en-us/articles/ - person M. S. B.; 29.06.2010
comment
+1: Намного лучше использовать недавние (и полезные) функции языка, чем старые навязчивые идеи, которые предлагали некоторые другие респонденты. - person High Performance Mark; 29.06.2010
comment
Прохладный! Жаль, что в 9.1, который я использую, его нет. Вместо этого я должен использовать нестандартные операторы Interface, оставшиеся с тех пор, когда DEC владел компилятором. - person T.E.D.; 29.06.2010
comment
@ T.E.D: вам следует переехать :-) Если вы не можете переместить свой компилятор на 11.1, переместитесь в магазин с $$$ на ежегодное обслуживание. - person High Performance Mark; 01.07.2010
comment
Если я правильно понял, то до конца года будем обновлять. Проблема в том, что у нас есть большое количество взаимосвязанных инструментов в нашей инструментальной цепочке, которые все должны работать вместе (включая RTX - своего рода настраиваемый уровень HAL для Windows, а некоторые мы обслуживаем сами в наше ограниченное время накладных расходов). После выхода новой версии Windows всегда проходит несколько лет, прежде чем все инструменты в цепочке обновляются, и все они могут быть обновлены вместе. - person T.E.D.; 02.07.2010

Я интегрировал C и Fortran около 20 лет назад и поддерживал эту интеграцию до 5 лет назад. Я использовал следующие приемы:

  • Я заметил, что компилятор Fortran помещает все символы в верхний регистр, поэтому убедитесь, что ваши функции C / C ++ также написаны в верхнем регистре. Чтобы проверить, как символы помещаются в файл .OBJ, используйте DUMPBIN.
  • Компилятор Fortran не понимает изменения имен, выполняемого компилятором C ++. Скомпилируйте все свои функции C ++, используя соглашение стиля C (используя extern "C")
  • Аргументы в Фортране всегда помещаются в стек с использованием ссылок / указателей. Поэтому используйте аргументы-указатели в своей функции C.

Честно говоря, я отказался от интеграции C и Fortran, когда перешел на VS2005, так что с тех пор все могло измениться. Тем не менее, по-прежнему рекомендуется использовать DUMPBIN, чтобы увидеть, какие символы создает компилятор Fortran, и настроить компиляцию исходных текстов C / C ++ в соответствии с этим.

person Patrick    schedule 28.06.2010
comment
Они немного изменились (в частности, многоязычные проекты больше не поддерживаются), но все это хороший совет. Единственное, что я бы изменил, - это предложить не полагаться на значения по умолчанию, а использовать блоки ИНТЕРФЕЙСА для точного определения всего. Развернуто в ответе. - person T.E.D.; 28.06.2010

Мы делаем это там, где я работаю.

Предполагая, что вы используете компилятор Intel Fortran, посмотрите его документацию. По умолчанию Intel Fortran передает все по ссылке и (я полагаю) использует соглашение о вызовах C с идентификатором, состоящим только из заглавных букв. Строки представляют собой особую проблему, поскольку Фортран любит передавать длину в качестве скрытого параметра с настройкой компилятора для того, где она находится в списке параметров.

Мудрый программист не полагается на значения по умолчанию (где ошибка может привести к неопределенному поведению) и будет использовать операторы intel INTERFACE для указания соглашения о вызовах, передачи параметров и имени ссылки для подпрограммы. Информация на на этой странице ATTRIBUTES Properties и Calling Conventions) обязательно к прочтению. В частности, вам это нужно, чтобы понять тайные правила того, когда и куда будут передаваться параметры длины строки. У меня есть распечатка, которую я храню при себе. :-)

Еще одна вещь, на которую следует обратить внимание, это то, что версии VisualStudio после 6 не любят смешанные проекты Fortran и C. Мы решили проблему, создав пользовательские файлы проекта, вызывающие makefile, но это PITA. Я бы посоветовал плыть по течению и использовать отдельные проекты, если вы не делаете это часто, как мы.

person T.E.D.    schedule 28.06.2010
comment
Что ж, предположительно у вас будет одна, содержащая вашу основную точку входа в программу (например: main(), если это C) и весь остальной код на ее языке, а другая будет содержать весь код для другого языка и быть скомпилирована в файл .lib. Конечно, оба в одном растворе. - person T.E.D.; 29.06.2010

Найдено решение: ссылка на решение

У меня было несколько проблем со связыванием, которые можно было решить, добавив свойства проекта.

код для тестирования:

#include <stdio.h>

extern "C"
{
    void f() 
    {
        printf("hi from c\n mega test");
    }
}

код Фортрана

PROGRAM HelloWorld
use, intrinsic :: iso_c_binding
implicit none 
interface
    subroutine f( ) bind( c )
        use, intrinsic :: iso_c_binding
    end subroutine f   
end interface  
call f
END PROGRAM HelloWorld

По запросу я могу загрузить тестовый проект. спасибо всем, надеюсь, это была моя последняя проблема с c и fortran

person LonliLokli    schedule 29.06.2010
comment
У меня возникла проблема со связыванием, когда я использовал заглавные буквы в имени функции. - person LonliLokli; 30.06.2010

Мне удалось собрать obj из исходников fortran благодаря Custom Build Tools Visual Express 2010. Думаю, это возможно и в Visual Studio.

Если вы хотите смешать C и Fortran вместе, есть хорошее руководство здесь. Он был написан для компиляторов gcc, но вы должны научиться легко справляться с искажением имен.

В зависимости от компилятора скомпилированные подпрограммы / функции имеют верхний / нижний регистр, с завершающим подчеркиванием, с ведущим подчеркиванием, ... Для успешной связи вы можете использовать инструменты dumpbin, чтобы увидеть, как имя отображается в объектном файле.

Другой способ - использовать iso_c_binding модули, но он доступен только в Fortran 2003.

person Thomas P.    schedule 10.12.2012

Вот как это работает с gcc и консолью

c.c:

#include <stdio.h>

void f_()
{
    printf("Hi from C\n");
} 

fortran.f90

PROGRAM HelloWorld
   CALL f
END PROGRAM HelloWorld

Makefile

SRCDIR=.

all: clean release run

release:
    gcc -c c.c -o c.out 
    gfortran -c fortran.f90 -o fortran.out
    gfortran -o out.exe fortran.out c.out
run:
    out.exe

clean:
    @$(ZSHMAGIC)  rm -rf *.exe core* *.o a.out 2> /dev/null

Еще один вопрос: всегда ли я добавляю '_' после имени c-функции, которую я использую в программе fortran?

person LonliLokli    schedule 28.06.2010
comment
Используйте DUMPBIN, чтобы увидеть, как компилятор Fortran генерирует символы. Затем настройте имена ваших функций C, чтобы они соответствовали этому. - person Patrick; 28.06.2010
comment
Я хотел бы сделать это возможным, независимым от платформы. Под Linux я использую nm, поэтому я знаю, что мне нужно добавить подпространство. - person LonliLokli; 29.06.2010