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