c++ - 使用 g++/intel C++ 编译器调用 fortran 函数

标签 c++ makefile fortran intel

我一直在尝试从商业有限元代码提供的库中调用一些函数。使用这个库的例子是用我的系统类型的英特尔 fortran 编译器编译的,所以我使用英特尔 C++ 编译器来链接目标文件,我已经建立了一个简单的测试用例,外部 declerations 为

extern "C" 
{ 
  int binini_( int* );
  int biniqr8_( int*, int* ); 
  int binset_( int*, int*, int*, int*, int*, int*, const char*, int*, int*, int* );
  int binrd8_( int*, int*, int*, int*, int*, int* );
  int binclo_( int*, const char*, int* );
} 

现在,我正在尝试使用带有以下 makefile 的英特尔 C++ 编译器:

CXX = icpc -parallel  

IncludeDir = /home/utabak/external_libraries/boost_1_46_1

LinkingDir0 = /home/utabak/external_libraries/boost_1_46_1/stage/lib
LinkingDir1 = /opt/ansys-12.1/v121/ansys/customize/misc/linx64 
LibLink1 = bin
LibLink2 = boost_filesystem
LibLink3 = boost_system

all: test1

test1: test_binlib1.o  
  ${CXX} -o $@ $? -L${LinkingDir0} \
      -L${LinkingDir1} \
      -l${LibLink1} -l${LibLink2} -l${LibLink3}


test_binlib1.o: test_binlib1.cc
  ${CXX} -I${IncludeDir} -c $?

链接和编译都很好。并按预期运行。我也想对 g++ 做同样的事情,经过反复试验,我设置了一个可以正常编译和链接的 make 文件:

CXX = g++ -g -pg -Wall -pthread

IncludeDir = /home/utabak/external_libraries/boost_1_46_1

LinkingDir0 = /home/utabak/external_libraries/boost_1_46_1/stage/lib
LinkingDir1 = /opt/ansys-12.1/v121/ansys/customize/misc/linx64 
LinkingDir2 = /home/utabak/intel/composerxe-2011/lib/intel64 

LibLink1 = bin
LibLink2 = boost_filesystem
LibLink3 = boost_system
LibLink4 = iomp5 # an extra library from intel compiler
                 # openmp, for intel C++ -parallel does it
                 # for g++ I have to explicitly link this

all: test1

test1: test_binlib1.o  
  ${CXX} ${LFLAGS} -o $@ $? -L${LinkingDir0} \
      -L${LinkingDir1} -L${LinkingDir2} \
      -l${LibLink1} -l${LibLink2} -l${LibLink3} -l${LibLink4}

test_binlib1.o: test_binlib1.cc
  ${CXX} -I${IncludeDir} -c $?

但是,这个可执行文件无法正确运行,奇怪的是,它有时会出现段错误或文件打开错误,我首先尝试使用上述 fortran 库函数 binset_ 打开文件。

我对这些错误的原因和差异感到困惑。这个问题的答案是什么?

最佳答案

我认为您可能会被传递的字符串捕获。在 Fortran 和 C++ 之间传递字符串时,需要考虑隐藏长度参数。您为 binset_ 和 binclo_ 显示的原型(prototype)不包括此内容。

默认情况下,当 Fortran 传递参数时,除了按值传递的字符串的隐藏长度参数外,它们都是按引用传递的。这个隐藏的长度参数被附加到参数列表的末尾。

考虑 Fortran 程序:

SUBROUTINE BLAH(MYSTRING)

C++ 端需要:

void blah_ (char *mystring, unsigned int mystringlength)

关于c++ - 使用 g++/intel C++ 编译器调用 fortran 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5754055/

相关文章:

c++ - 无法编译 QtCreator

c++ - 禁用没有宏的 C++ 代码

c++ - 如何在不递归的情况下找到所有可能的字谜?

c++ - printf( ) 的内存消耗

java - Mac 操作系统中的 Makefile "No rule to make target"错误

ubuntu - Fortran 的 ODE 求解库,用于 Ubuntu x64

makefile - 在Makefile中导出环境变量

google-chrome-extension - 使用Make编译Chrome应用时,没有规则会导致目标错误

Python glmnet "No module named _glmnet"

generics - 如何直接使用泛型函数定义一个新的Fortran过程?