gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:01:27 25 4
gpt4 key购买 nike

我一直在尝试从商业有限元代码提供的库中调用一些函数。使用这个库的例子是用我的系统类型的英特尔 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/

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