2010-06-28 4 views
2

Я ищу способ, как я могу интегрировать код C++ с кодом fortran (я хочу просто вызвать некоторые функции C/C++ в коде fortran).Вызов кода C/C++ формирует программу fortran в визуальной студии? (Как скомпилировать смешанный код C и fortran в visual studio)

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

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

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

thx.

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

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

+0

Нет языка «C/C++». Я считаю, что в этом случае эта путаница напрямую влияет на ваши проблемы. – MSalters

+1

Я знаю разницу между c и C++ в контексте вызова кода из fortran. Я ищу способ интегрировать 2 проекта в Visual Studio. Один в Фортране, а другой в C или C++. Поэтому я использую запутанное выражение C/C++. – LonliLokli

ответ

4

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

+0

Моя проблема теперь в том, чтобы интегрировать мой C++ в существующий проект Fortran в Visual Studio 2008. Есть ли учебник, как это сделать? – LonliLokli

+0

@LonliLokli - У меня нет VS на машине, с которой я пишу, но не существует чего-то о программировании на смешанном языке в помощи fortran. Я уверен, что видел это в какое-то время. – Rook

+0

Кроме того, что сказал MSB. – Rook

2

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

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

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

+0

Они немного изменились (в частности, проекты на смешанном языке больше не поддерживаются), но это все хорошо. Единственное, что я бы изменил, это предложить не полагаться на значения по умолчанию, а использовать блоки INTERFACE, чтобы точно указать все. Расширяется в ответе. –

0

Это, как он работает с GCC и консоли

куб.см:

#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 

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

+0

Используйте DUMPBIN, чтобы увидеть, как компилятор Fortran генерирует символы. Затем отрегулируйте имена ваших функций C, чтобы они соответствовали этому. – Patrick

+0

Я хотел бы сделать это возможной платформой независимой. В linux я использую nm, поэтому я знаю, что мне нужно добавить недоразумение. – LonliLokli

2

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

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

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

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

+0

Что такое рабочий процесс, если я буду использовать 2 проекта? – LonliLokli

+0

Ну, предположительно, у вас будет одна, содержащая вашу основную точку входа в таблицу (например: 'main()', если она есть C), и весь остальной код на своем языке, а другой будет содержать весь код для другого язык и скомпилироваться в файл .lib. Конечно, в одном и том же «решении». –

1

Решение найдено: solution link

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

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

#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 

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

+0

У меня возникла проблема со связыванием, когда я использовал прописные буквы в имени функции. – LonliLokli

1

Я смог построить obj из источников fortran благодаря Custom Build Tools Visual Express 2010. Возможно, это также возможно в Visual Studio.

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

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

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