だから私は特別な数学関数を使いたかったのですが、それを持っているCライブラリを見つけることができませんでした、しかしそれを実装した古いFortranライブラリスレートを見つけたので、それを使うために私はこれらの命令を私の場合に適応させました: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コンパイラーで見事に機能しますが、私は現在、主にIntelコンパイラーを使用するクラスターでコンパイルしようとしていますが、-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でベッセル関数が必要な場合は、C99標準の関数では不十分ですか?http://www.gnu.org/software/libc/manual/html_node/Special-Functions.html
IntelFortran固有のFortranを無効にする正しいオプションmain
は-nofor-main
です。
libgfortran
gfortranのFortranランタイムライブラリです。fortranサブルーチンをgfortranでコンパイルし、icc
それを使用してコンパイルされたCソースから呼び出すだけの場合は機能するはずです。
Intel Fortranを使用している場合は、もちろんそれはありません。独自のランタイムライブラリlibifcore
とがありlibifcoremt
ます。を介して、-lifcore -lifcoremt
またはのifort
代わりにを使用してリンクすることにより、それらをリンクする必要がありicc
ます。しかし、それはあなたがそれらを必要としない可能性が非常に高いです。
最後に、Cライブラリを見つけることは問題ではないはずです。GNU ScientificLibraryをお試しください。IntelのMKLにもそれらが含まれていると思います。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加