【问题标题】:Linking C/C++ and Fortran, unresolved external symbols链接 C/C++ 和 Fortran,未解析的外部符号
【发布时间】:2013-07-30 14:05:33
【问题描述】:

用于典型用途的我的 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

ma​​in.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)。

任何帮助将不胜感激。

【问题讨论】:

  • @DrewMcGowen 格式很好,需要!
  • 其他人可能需要重新格式化fortran部分,因为我不知道fortran,我不知道任何典型的格式化样式。
  • 当您明确使用 Fortran 2003 的功能时,为什么要标记 fortran90? (例如,iso_c_binding)

标签: c++ c fortran90


【解决方案1】:

一个问题是您在 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

【讨论】:

  • 非常感谢您的帮助。现在,一切编译正常,工作正常。如果我有任何问题,我会问你
猜你喜欢
  • 1970-01-01
  • 2014-07-17
  • 2013-02-28
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 2012-06-30
相关资源
最近更新 更多