gcc f90子程序与c程序的连接

dgiusagp  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(92)

简单的程序
main.C

#include <iostream>
void sub3();

int main(void)
{
    std::cout << "Hello from C World\n";
        sub2();
    sub3();
    return(0);
}
void sub2(){
    std::cout << "Sub1\n";
    return;
}

字符串
和sub3.f90

subroutine sub3() 
    write(*,*) 'Hello from F90 sub3'
    return
    end


使用Ubuntu,
gfortran -c -fno-underscoring sub3.f90
是为了防止名称与附加的下划线混淆
gcc(或g++)main.C -c
使用-lgfortran -lsdtc++的组合与gfortran或gcc链接
找不到将sub 3或sub 3()作为定义引用的组合。
最好是CMake工作,也
CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
project(ProjName VERSION 0.1.0 LANGUAGES  C CXX Fortran)
include(FortranCInterface)

set( CMAKE_CXX_FLAGS "-lgfortran")
set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -lstdc++ -fno-underscoring")
set( CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS}  )
add_library(ProjFLib sub3.f90 )
add_executable( ProjTest  main.C  )
target_link_libraries( ProjTest  ProjFLib )


无论是附加(或抑制)下划线,都不能将组合链接,某些迭代具有对throw_length_ 错误的未定义引用,操作符delete(),.

svujldwt

svujldwt1#

一些小的修复和改进,使其工作:

  • 您需要通过将原型放在extern "C"块中来禁用C++名称修改。
  • 要避免依赖非标准Fortran编译器选项来禁用Fortran名称修改,请使用bind(C)功能。
  • 我必须把sub2()放在main()之前,否则编译器会抱怨缺少声明(或者写一个原型也可以)。

因此,main.cpp:

#include <iostream>
extern "C" {
    void sub3();
}

void sub2(){
    std::cout << "Sub1\n";
    return;
}
int main(void)
{
    std::cout << "Hello from C World\n";
    sub2();
    sub3();
    return(0);
}

字符串
sub3.f90:

subroutine sub3() bind(C, name="sub3") 
    write(*,*) 'Hello from F90 sub3'
    return
end


编译并运行:

$ gfortran -O2 -Wall -c sub3.f90
$ g++ -O2 -Wall main.cpp sub3.o -lgfortran
$ ./a.out 
Hello from C World
Sub1
 Hello from F90 sub3

相关问题