我的 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;
}
另一方面,我也从一个 C/C++ 静态库项目的类函数中调用了 fortran 函数,但我遇到了相同类型的错误 (LNK2019
) .
如有任何帮助,我们将不胜感激。
最佳答案
一个问题是您在 C++ 中声明 bar_ftn
,这会导致 name mangling,也就是奇怪的 ?bar_ftn@@YAXHPAD@Z
您在错误消息中看到的文本。为避免这种情况,您需要在函数声明之前添加 extern "C"
:
extern "C" void bar_ftn ( int flag_len, char* flag ); // note that 'extern' by itself is unnecessary
关于c++ - 链接 C/C++ 和 Fortran,未解析的外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17949269/