компоновщик — смешанная проблема C ++ и Fortran Linking

Я провел поиск в Интернете, но не могу узнать, как скомпилировать простой код на C ++ и Fortran из linux. Мне нужно разобраться с этим, но мне просто нужно знать, как начать с простого примера.

Мой код на C ++ такой:

#include <iostream>
using namespace std;

extern int Add( int *, int * );
extern int Multiply( int *, int * );

int main()
{
int a,b,c;
cout << "Enter 2 values: ";
cin >> a >> b;

c = Add(&a,&b);
cout << a << " + " << b << " = " << c << endl;
c = Multiply(&a,&b);
cout << a << " * " << b << " = " << c << endl;
return 0;
}

Мой код на Фортране такой:

integer function Add(a,b)
integer a,b
Add = a+b
return
endinteger function Multiply(a,b)
integer a,b
Multiply = a*b
return
end

я использую ifort скомпилировать мой код на Фортране и g ++ для кода C ++. Я пробовал эту терминальную команду:

$ ifort -c Program.f90
$ g++ -o Main.cpp Program.o

Но ошибка, которую я получаю, гласит: «Входной файл компоновщика не используется, потому что соединение не выполнено». Я не уверен, как связать их вместе. Если бы кто-то мог помочь мне, я был бы очень признателен!

PS — я попытался добавить -lg2c в конце моей строки компиляции, и это не признается.

5

Решение

Здесь есть несколько проблем, которые не позволяют именам объектов совпадать. Сначала укажите в коде C ++, что внешние функции имеют сигнатуру C:

В test.cpp:

extern "C" int Add( int *, int * );
extern "C" int Multiply( int *, int * );

Увидеть В источнике C ++, каков эффект от extern "С"? Больше подробностей.

В своем коде на Фортране сделайте интерфейс явным, поместив процедуры в модуль, и используйте iso_c_binding чтобы объекты Fortran отображались как допустимые объекты C. Обратите внимание, что мы можем явно указать имена объектов, которые программы на C или C ++ будут видеть через bind ключевое слово:

test_f.f90:

module mymod
use iso_c_binding
implicit none

contains

integer(kind=c_int) function Add(a,b) bind(c,name='Add')
integer(kind=c_int) :: a,b
Add = a+b
end function

integer(kind=c_int) function Multiply(a,b) bind(c,name='Multiply')
integer(kind=c_int) :: a,b
Multiply = a*b
end function

endmodule mymod

Скомпилируйте (не обращайте внимания на использование пакета Intel, мой g ++ & гфортран очень стар)

$ ifort -c test_f.f90
$ icpc -c test.cpp

Ссылка на сайт:

$ icpc test_f.o test.o

проведение a.out теперь должен работать как положено.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]