Вызываете ли C / C ++ код из фортрановской программы в Visual Studio?(Как скомпилировать смешанный C и Fortran-код в Visual Studio) - PullRequest
2 голосов
/ 28 июня 2010

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

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

В настоящее время я думаю о создании dll-формы c ++ и вызове ее из кода Fortran.*

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

thx.

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

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

Ответы [ 6 ]

4 голосов
/ 28 июня 2010

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

2 голосов
/ 28 июня 2010

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

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

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

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

2 голосов
/ 28 июня 2010

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

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

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

1 голос
/ 11 декабря 2012

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

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

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

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

1 голос
/ 29 июня 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

0 голосов
/ 28 июня 2010

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

cc:

#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-функции, которое я использую в программе на Фортране?

...