C++ 链接C/C++;和Fortran,未解析的外部符号

C++ 链接C/C++;和Fortran,未解析的外部符号,c++,c,fortran90,C++,C,Fortran90,我的Visual studio 2010解决方案文件通常由一个fortran项目(静态库类型,由source1.f90组成)、一个C/C++项目(应用程序类型,包含main.cpp)和13个C/C++项目(静态库类型,包含不同类的不同.cpp/.h文件)组成。我的目的是从一个C/C++静态库类型项目中调用fortran源文件中的一些函数,但我无法生成程序,并且出现错误 我的第一次尝试是从main.cpp调用fortran子程序。但我得到了以下错误: Error 2 error LNK

我的Visual studio 2010解决方案文件通常由一个fortran项目(静态库类型,由source1.f90组成)、一个C/C++项目(应用程序类型,包含main.cpp)和13个C/C++项目(静态库类型,包含不同类的不同.cpp/.h文件)组成。我的目的是从一个C/C++静态库类型项目中调用fortran源文件中的一些函数,但我无法生成程序,并且出现错误

我的第一次尝试是从main.cpp调用fortran子程序。但我得到了以下错误:

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;
}
#包括
#包括
使用名称空间std;
外部无效条(内部标志、字符*标志);
静态空隙
显示用法(字符*程序名);
int main(int argc,char*argv[])
{
char ctext[]=“helloworld abcdefghijklmnopqrstuvxyz abcdefghijklmnopqrstuvxyz”;
int-ctext_len=sizeof(ctext);
//调用Fortran
酒吧ftn(ctext,ctext);
返回0;
}
另一方面,我还从一个C/C++静态库项目的一个类函数调用了fortran函数,但是我得到了相同类型的错误(
LNK2019


<> P> >一个问题是,你在C++中声明了代码> BARYFFTN <代码>,这导致了名字的混乱,也就是奇怪的<代码>?YAXHPAD@Z您在错误消息中看到的文本。为了避免这种情况,您需要在函数声明之前添加
extern“C”

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

@DrewMcGowen很棒的格式,这是必需的!其他人可能需要重新格式化fortran部分,因为我不懂fortran,我不知道任何典型的格式化样式。当您明确使用fortran 2003的功能时,为什么要标记fortran 90?(例如,iso_c_binding)非常感谢您的帮助。现在,一切都编译好了,工作正常。如果我有任何问题,我会问你