2013-07-30 70 views
0

我的Visual Studio 2010解决方案文件典型用途包含一个fortran项目(静态库类型,由source1.f90组成),一个C/C++项目(应用程序类型并包含main.cpp)和13 C/C++项目(静态库类型并包含不同类的不同.cpp/.h文件)。我的目的是从一个C/C++静态库类型项目中调用fortran源文件中的一些函数,但是我无法构建该程序并且出现错误。链接C/C++和Fortran,无法解析的外部符号

我的第一次尝试是从main.cpp调用fortran子例程。不过,我收到以下错误:

Error 2 error LNK2019: unresolved external symbol "void __cdecl 
bar_ftn(int,char *)" ([email protected]@[email protected]) 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

@DrewMcGowen伟大的格式化,需要! –

+0

其他人可能需要重新格式化fortran部分,因为我不知道fortran,我不知道任何典型的格式化样式。 –

+0

当您明确使用Fortran 2003的功能时,为什么要标记'fortran90'? (例如,iso_c_binding) –

回答

2

的一个问题是,你在C++中,这将导致名字改编,又名奇[email protected]@[email protected]文本你在错误信息请参阅声明bar_ftn。为避免这种情况,您需要在函数声明之前加上extern "C"

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

非常感谢您的帮助。现在,一切正常,工作正常。我会问你是否有任何问题 – sa112