我正在尝试编译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子例程链接到C++主程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18662906/