c - 英特尔编译器 : linking a fortran compiled library to main program of C

标签 c compiler-construction makefile fortran intel

所以我想使用一个特殊的数学函数,但找不到包含它的 C 库,但是我找到了一个实现了它的旧 Fortran 库 slatec,所以为了使用它,我将这些说明改编为我的案例:http://difdop.polytechnique.fr/wiki/index.php/How_to_Bessel_Functions_in_C

我正在使用 makefile 进行编译,这是 GNU 案例中的内容摘录

CFLAGS=-Wall -O2
CC=gcc
MPICC=mpicc -DDEBUG_INPUT
LIBS=-lm -lgfortran

THIS_DIR=$(shell pwd)

WEAKWEAK_OBJECTS=manager_weakweak.o worker_weakweak.o bunch_weak.o transform_weak.o cyclic_array.o
WEAKSTRONG_OBJECTS=manager_weakstrong.o worker_weakstrong.o bunch_strong.o fbi_weakstrong.o rw_weakstrong.o
../mbtrack-mpi : ./besselh/libamos.a mbtrack-mpi.o confmpi.o input.o test.o ${WEAKWEAK_OBJECTS} ${WEAKSTRONG_OBJECTS} bunch.o stats.o physic.o statistics.o tracking.o rw_table.o rw_new.o lagrange.o feedback.o nrutil.o
    ${MPICC} $(CFLAGS) $^ -o $@ $(LIBS) -L$(THIS_DIR)/besselh $(THIS_DIR)/besselh/libamos.a

一切都与 GNU 编译器配合得非常好,但我目前正在尝试在主要使用英特尔编译器的集群上进行编译,但未找到 -lgfortran

我在 Intel 的文档中读到,使用 -nofor-main 标志应该允许链接发生,但编译器只是提示链接错误:

    cc -DDEBUG_INPUT -Wall -O2  -I/opt/local/include besselh/libamos.a mbtrack-mpi.o 
 confmpi.o input.o test.o manager_weakweak.o worker_weakweak.o bunch_weak.o 
 transform_weak.o cyclic_array.o manager_weakstrong.o worker_weakstrong.o 
 bunch_strong.o fbi_weakstrong.o rw_weakstrong.o bunch.o stats.o physic.o statistics.o 
 tracking.o rw_table.o rw_new.o lagrange.o feedback.o nrutil.o -o ../mbtrack-mpi -lm -
 lifcore -lifcoremt  -L/global/u1/j/jackb/work/new_rw_2/src/besselh 
 /global/u1/j/jackb/work/new_rw_2/src/besselh/libamos.a

/opt/intel/composer_xe_2013_sp1.2.144/compiler/lib/intel64/libifcore.a(for_main.o): dans la fonction « main »:

for_main.c:(.text+0x54): référence indéfinie vers « MAIN__ »
/usr/bin/ld: erreurs de lien trouvés, destruction de l'exécutable « ../mbtrack-mpi »
make: *** [../mbtrack-mpi] Erreur 1

我想知道是否有像我在 GNU 编译器中使用的 -lgfortran 库标志一样简单的东西?

尝试在集群上调整编译器:

这里是编译库的规则:

   ./besselh/libamos.a : FORCE
               cd besselh/; $(MAKE) libamos.a

以及besselh目录下Makefile的内容:

libamos.a: $(files_o)
#       ftn -nofor-main -fdefault-real-8 -fdefault-double-8 -c $(files_f)
        ar cru libamos.a $(files_o)
        ranlib libamos.a

$(files_o): $(files_f)
        ftn -nofor-main -c $(files_f)
clean: 
        rm -f $(files_o)
        rm -f libamos.a

最佳答案

如果您只需要 C 中的 Bessel 函数,那么 C99 标准中的那些还不够吗? http://www.gnu.org/software/libc/manual/html_node/Special-Functions.html

在英特尔 Fortran 中禁用 Fortran 特定 main 的正确选项是 -nofor-main

libgfortran 是 gfortran 的 Fortran 运行时库。如果您使用 gfortran 编译 Fortran 子例程并且只是从使用 icc 编译的 C 源代码调用它们,它应该可以工作。

如果您使用的是 Intel Fortran,那么它当然没有。它有自己的运行时库 libifcorelibifcoremt。您应该通过 -lifcore -lifcoremt 或使用 ifort 而不是 icc 链接它们。但您很可能不需要它们。

最后,找个C库应该不成问题。试试 GNU Scientific Library .我认为英特尔的 MKL 也包含它们。

关于c - 英特尔编译器 : linking a fortran compiled library to main program of C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25096153/

相关文章:

c - 堆栈变量的寻址

c - MPI_Get_count 返回计数负值

c - 如何识别 USB ISO 传输中用于 CRC(校验和)的数据字节?

c - 是否有像 gccxml 这样的用于包装器生成的 C header 解析器工具?

linux - Makefile什么都不做

c - GTK 应用程序不会从对话框中退出

compiler-construction - pretty-print 歧义语法

c++ - 来自#include 的标准库编译器错误——所有库都会导致终端错误

c++ - Makefile 中的多个跃点

c++ - 从 Makefile 到 Cmake