所以我想使用一个特殊的数学函数,但找不到一个拥有它的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
。
我在英特尔的文档中读到,使用-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
答案 0 :(得分:1)
如果您只想在C中使用贝塞尔函数,那么C95标准中的那些不够吗? http://www.gnu.org/software/libc/manual/html_node/Special-Functions.html
在英特尔Fortran中禁用Fortran特定main
的正确选项是-nofor-main
。
libgfortran
是gfortran的Fortran运行时库。如果您使用gfortran编译Fortran子例程并且只是使用icc
编译的C源调用它们,它应该可以工作。
如果您使用的是英特尔Fortran,那么它当然没有它。它有自己的运行时库libifcore
和libifcoremt
。您应该通过-lifcore -lifcoremt
或使用ifort
而不是icc
进行关联来关联它们。但很可能你不需要它们。
最后,找到C库应该不是问题。试试GNU Scientific Library。我认为英特尔的MKL也包含它们。