gpt4 book ai didi

c++ - 如何将 fortran 子程序链接到 cpp 主程序?

转载 作者:行者123 更新时间:2023-11-30 02:52:42 30 4
gpt4 key购买 nike

我正在尝试编译一个 C++ 程序,但它不起作用。首先,我应该说 c++ 不是我真正了解的语言,我使用 Fortran。无论如何,主要的 c++ 程序调用一个 fortran 子例程。我可以编译这个子例程,但是当我想编译 c++ 程序时出现链接错误。真正的程序很大,调用了很多子程序,所以我做了一个简单的测试(简单的程序只调用一个子程序),但效果不佳!当我想创建 .x 时,我的子例程未定义。这是 c++ 程序 (test-TQINIT.cpp) 和子程序 (TQINIT.f)。

测试-TQINIT.cpp:

  #include <iostream>

using namespace std;

extern "C"
{
void TQINIT_(int*, int*);
}

main()
{ int NWG;
NWG=80000;
int *IWSG = new int[NWG];
TQINIT_(IWSG,&NWG);
}

TQINIT.f:

  SUBROUTINE TQINIT(IWSG,NWG)
IMPLICIT NONE

INTEGER NWG
INTEGER IWSG(NWG)
LOGICAL TQG2ERR
INTEGER IERR

CALL TQRSERR

CALL TQINI(NWG,IWSG)

IF (TQG2ERR(IERR)) THEN
WRITE(6,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
WRITE(6,*)'ERROR INITIALIZING (TQINIT) !!!'
WRITE(6,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
STOP
ENDIF

END

我使用以下方法编译子例程:

  gfortran -c TQINIT.f 

并得到一个 TQINIT.o

然后我使用以下方法编译主程序:

  g++ -c test-TQINIT.cpp 

并得到一个测试-TQINIT.o。

然后创建我使用的 .x(TQINIT.f 需要库):

  g++ test-TQINIT.o TQINIT.o -L/usr/local/thermocalc/3.0/SDK/TQ8 -ltq-linux-x86_64-gfortran44-8 -o test-TQINIT.x

这是我得到的:

  test-TQINIT.o: In function `main':
test-TQINIT.cpp:(.text+0x33): undefined reference to `TQINIT_'
collect2: ld returned 1 exit status

我希望有人能够帮助我。提前谢谢你。

最佳答案

Fortran 不区分大小写,目标文件中的子例程名称通常(据我所知)以小写字母和下划线结尾,因此您的名称可能是 tqinit_ 而不是TQINIT_,所以你在 C++ 中的调用应该是小写的。

您可以使用 Alexander Vogt 的回答中给出的 objdump -t TQINIT.o 命令或更简单的 nm TQINIT.o 验证目标文件中的名称更简洁。

关于c++ - 如何将 fortran 子程序链接到 cpp 主程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18662906/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com