Связывание C / C ++ и Fortran, неразрешенные внешние символы

Файл решения Visual Studio 2010 для типичной цели состоит из одного проекта fortran (статического типа библиотеки и состоит из source1.f90), одного проекта C / C ++ (типа приложения и содержит main.cpp) и проекта 13 C / C ++ ( статического типа библиотеки и содержит разные файлы .cpp / .h для разных классов). Моя цель — вызвать некоторые функции из исходных файлов на фортране из одного проекта типа статической библиотеки C / C ++, но я не могу собрать программу и получаю ошибки.

Моей первой попыткой было вызвать подпрограмму fortran из main.cpp. Но я получаю следующую ошибку:

Error    2    error LNK2019: unresolved external symbol "void __cdecl
bar_ftn(int,char *)" (?bar_ftn@@YAXHPAD@Z) referenced in function _main
G:\VS2010\uakron\sourcefiles\application\main.obj
Error    3    error LNK1120: 1 unresolved externals    G:\VS2010\uakron
\build\win\debug\application_app.exe    1

source1.f90

subroutine bar_ftn ( len_input_file, input_file ) bind( c )
use, intrinsic :: iso_c_binding, only : c_int
implicit none
integer(c_int), value, intent(in) :: len_input_file
character(len=1), intent(in) :: input_file(len_input_file)

! Local declarations (copy c char array into fortran character)
character(len=len_input_file) :: infile
integer :: i

print *, "in bar_ftn"print *, len_input_file
do i=1,len_input_file
end do
end subroutine bar_ftn

main.cpp

#include<iostream>
#include<fstream>

using namespace std;
extern void bar_ftn ( int flag_len, char* flag );
static void
DisplayUsage(char* programName);

int main(int argc, char *argv[])
{
char ctext[]="helloworld abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz";
int ctext_len=sizeof(ctext);

//Call the Fortran
bar_ftn( ctext_len, ctext );

return 0;
}

С другой стороны, я также вызывал функцию fortran из одной из функций класса из одного из проектов статической библиотеки C / C ++, но получаю ошибку того же типа (LNK2019).

Любая помощь будет высоко оценен.

0

Решение

Одна проблема в том, что вы объявляете bar_ftn в C ++, что приводит к название искажения, иначе странный ?bar_ftn@@YAXHPAD@Z текст, который вы видите в сообщении об ошибке. Чтобы избежать этого, вам нужно предварительно extern "C" до объявления функции:

extern "C" void bar_ftn ( int flag_len, char* flag ); // note that 'extern' by itself is unnecessary
2

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

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

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