Создать файл мода из заголовка c - PullRequest
0 голосов
/ 13 ноября 2010

Я установил gcc и gfortran в AIX, и они работают нормально.Среди прочего я использую их с некоторыми библиотеками, доступ к которым осуществляется с помощью заголовочных файлов (.h в C).Те же самые библиотеки можно использовать с модулями (.mod в фортране), но, как вы знаете, их использование не является обязательным: если я закомментирую

use mylib
implicit none

из моего исходного кода на фортране, все будет работать нормально.Проблема в том, что я не хочу комментировать implicit none, поэтому я должен оставить также use mylib, иначе я получу кучу ошибок

Error: Symbol 'foo' at (1) has no IMPLICIT type

.И, как вы знаете, файлы .mod зависят от компилятора, поэтому я не могу использовать те, которые у меня есть, иначе gfortran будет плюнуть:

Fatal Error: File 'mylib.mod' opened at (1) is not a GFORTRAN module file

Теоретически я могу перекомпилировать все библиотеки с gfortran, но, скорее всегопо разным причинам это не удастся (и если этого не произойдет, это все равно будет сложной задачей).

Поэтому мне интересно, есть ли способ прекомпиляции заголовка .h в модуле .mod, предоставляя только интерфейсную информацию, которая является всем, что необходимо.К сожалению, я не смог найти никакой информации об этом.

Ответы [ 2 ]

2 голосов
/ 13 ноября 2010
Заголовочные файлы

C не будут производить файлы модулей Fortran. Файлы модулей Fortran зависят от компилятора, но обычно создаются при компиляции файлов Fortran, содержащих модули. Они записывают информацию о модуле исходного кода, например, о процедурах, которые он содержит, и их соглашениях о вызовах, для использования компилятором, когда он сталкивается с вызовами этих процедур. Это метод, с помощью которого компилятор автоматически вызывает вызовы процедур модуля. Обычно вы должны скомпилировать файл исходного кода на Фортране, содержащий модуль (здесь модуль «mylib»), прежде чем компилировать файл, в котором есть основная программа или процедура, которая его использует. Почему вы предполагаете, что компиляция библиотек с помощью gfortran, скорее всего, не удастся или будет сложной? Я предлагаю попробовать. Вы не можете скомпилировать файл C .h в модуль. Если бы автор библиотеки Фортрана захотел, они могли бы предоставить файл с интерфейсами Фортрана, который описал бы процедуры и мог бы быть скомпилирован в модуль. Но эта техника подвержена ошибкам, потому что это означает, что есть две вещи, которые должны быть согласованы.

Если библиотеки находятся на C и вызываются из Fortran через привязку ISO C, то лучший способ - написать файл с интерфейсами. Был ли предоставлен такой файл на Фортране? Откуда поступили неправильные файлы модуля? Когда вы скомпилируете этот файл с помощью gfortran, вы получите файл .mod. В то время как дублирование между фактическим исходным кодом C и объявлениями интерфейса Fortran означает, что необходимо поддерживать два элемента, в этом случае это необходимо, поскольку исходный исходный код находится на C, а операторы интерфейса Fortran описывают процедуры C для компилятора Fortran в Fortran.

1 голос
/ 15 ноября 2010

Вы можете объявить функции / подпрограммы, которые вы используете из модуля, как external в пользовательском файле mylib.fh, например:

#mylib.fh
external my_function

В вашем коде Fortran вы должны использовать:

implicit none
include 'mylib.fh'
...