Я пытаюсь использовать функцию из библиотеки, написанной на С++, в своей программе, написанной на Фортране. Библиотека С++ собрана в одном заголовочном файле, поэтому, если вы хотите использовать ее в другой программе на С++, вам нужно сделать только #include functions.h
Я хотел бы узнать, как сделать что-то подобное на Фортране.
Из моего исследования я создал этот минимальный жизнеспособный пример:
clib/functions.h:
#ifndef ADD_H
#define ADD_H
extern "C"
{
int __stdcall add(int x, int y);
}
#endif
clib/functions.cpp:
extern "C"
{
int __stdcall add(int x, int y)
{
return x + y;
}
}
cinclude.c
#include "clib/functions.h"
интерфейс.f95:
module cinterface
use,intrinsic::ISO_C_BINDING
integer(C_INT)::a,b
interface
integer(C_INT) function add(a,b) bind(C,name="add")
use,intrinsic::ISO_C_BINDING
implicit none
!GCC$ ATTRIBUTES STDCALL :: add
!DEC$ ATTRIBUTES STDCALL :: add
integer(C_INT), value ::a,b
end function add
end interface
end module cinterface
основной.f90
program main
use cinterface
implicit none
integer :: c
c = add(1,2)
write(*,*) c
end program
make-файл:
FC = gfortran
CC = g++
LD = gfortran
FFLAGS = -c -O2
CFLAGS = -c -O2
OBJ=main.o
DEP = \
cinterface.o cinclude.o
.SUFFIXES: .f90 .f95 .c .o
# default rule to make .o files from .f files
.f90.o : ; $(FC) $(FFLAGS) $*.f90 -o $*.o
.f95.o : ; $(FC) $(FFLAGS) $*.f95 -o $*.o
.c.o : ; $(CC) $(CFLAGS) $*.c -o $*.o
%.o: %.mod
#
main.ex: ${DEP} ${OBJ}
$(LD) ${DEP} ${OBJ} -o prog.exe
#
Когда я пытаюсь сделать этот проект с помощью Cygwin, я получаю следующую ошибку:
main.o:main.f90:(.text+0x13): undefined reference to `add'
main.o:main.f90:(.text+0x13): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `add'
collect2: error: ld returned 1 exit status
make: *** [makefile:19: main.ex] Error 1
Как я могу заставить работать функцию add
в Fortran?
cinclude.o
? [Может потребоваться больше, но если вы попытаетесь добавить это в ссылку, мы, вероятно, сможем помочь вам больше.] - person francescalus   schedule 10.07.2018clib\functions.h
в make-файл или добавление тудаfunctions.o
изclib\functions.cpp
? Потому что в исходной задаче добавление всех полей объектов, созданных из исходных файлов, невозможно (или, по крайней мере, непрактично). - person T.Brown   schedule 10.07.2018nm cinlcude.o
сообщаетnm: 'cinlcude.o': No such file
. Как может произойти искажение add в add_ и как я могу это проверить? что касается значения атрибута, я подозревал, что это не должно создавать проблем при создании проекта, не так ли? - person T.Brown   schedule 10.07.2018VALUE
для фиктивных аргументовa
иb
иfunction add
. Также вам понадобится!GCC$ ATTRIBUTES STDCALL :: add
, и!DEC$ ATTRIBUTES STDCALL :: add
тоже не помешает. Отсутствие атрибута STDCALL может помешать компоновке, если вы компилируете для 32-битной версии. - person user5713492   schedule 10.07.2018VALUE
к аргументамa,b
следующим образом:integer(C_INT),value::a,b
, однако я не смог понять, что вы имеете в виду, добавив его кfunction add
. И куда мне поставить!GCC$ ATTRIBUTES STDCALL :: add
и!DEC$ ATTRIBUTES STDCALL :: add
. Прошу прощения за глупый вопрос. - person T.Brown   schedule 10.07.2018functions.c
, чтобы он летал. Теперь он компилируется, компонуется и работает корректно. - person user5713492   schedule 10.07.2018g++ -c functions.cpp
gfortran -c cinterface.f90
gfortran main.f90 functions.o -omain
построил мнеmain.exe
. Убедитесь, что вы также изменилиfunctions.cpp
, а такжеcinterface.f90
. - person user5713492   schedule 10.07.2018