Autotools将链接库的-l标志放在compile命令的错误位置

时间:2017-01-26 19:28:00

标签: fortran fortran90 autotools intel-fortran intel-mkl

我尝试使用autotools编译Fortran 90程序。我的makefile.am在这里:

AUTOMAKE_OPTIONS = foreign subdir-objects
bin_PROGRAMS = medys
medys_SOURCES =   src/all_v001/basics.f90 src/all_v001/variables.f90 src/all_v001/read_input.f90 src/all_v001/math.f90 src/all_v001/champ1.f90 src/all_v001/grille.f90 src/all_v001/NewSubroutines.f90 src/all_v001/Tests.f90 src/all_v001/string.f90 src/all_v001/io_module.f90 src/all_v001/precision.f90 src/core/error.f90 src/all_v001/matrix_modifications.f90 src/all_v001/matrix_temp_lowlvl.f90 src/all_v001/matrix_temp_highlvl.f90 src/all_v001/read_columbus.f90 src/all_v001/ortho.f90 src/all_v001/qp_integrals.f90 src/all_v001/observable.f90 src/all_v001/nouveaudrt.f90 src/all_v001/read_gamess.f90 src/all_v001/dynamique.f90  src/main/main.f90

AM_FCFLAGS =  -L/opt/intel/composer_xe_2013_sp1.3.174/mkl/lib/intel64 -I/opt/intel/composer_xe_2013_sp1.3.174/mkl/include/intel64/lp64/ -lmkl_intel_lp64 -lmkl_core -lmkl_intel_thread -lpthread -liomp5 -lmkl_blas95_lp64 -lmkl_lapack95_lp64 -nogen-interface -fpe0  -traceback -debug extended -heap-arrays -fp-stack-check -debug all -openmp

我的configure.ac就在这里:

AC_INIT([medys], [0.1], [meitnerium109@gmail.com])
m4_define([_AC_F95_FC], [ifort])
AC_CONFIG_SRCDIR([src/main/main.f90])
AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE
AC_PROG_FC
AC_PROG_CC
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

每个.o文件都能正确编译,但对于bin文件编译失败。如果我手动编译,但在编译结束时添加FLAG,则编译成功。使用make命令,编译失败:

ifort -L/opt/intel/composer_xe_2013_sp1.3.174/mkl/lib/intel64 -I/opt/intel/composer_xe_2013_sp1.3.174/mkl/include/intel64/lp64/ -lmkl_intel_lp64 -lmkl_core -lmkl_intel_thread -lpthread -liomp5 -lmkl_blas95_lp64 -lmkl_lapack95_lp64 -nogen-interface -fpe0  -traceback -debug extended -heap-arrays -fp-stack-check -debug all -openmp  -g -L/opt/intel/composer_xe_2013_sp1.3.174/mkl/lib/intel64 -I/opt/intel/composer_xe_2013_sp1.3.174/mkl/include/intel64/lp64/  -lmkl_intel_lp64 -lmkl_core -lmkl_intel_thread -lpthread -liomp5 -lmkl_blas95_lp64 -lmkl_lapack95_lp64  -o medys src/all_v001/basics.o src/all_v001/variables.o src/all_v001/read_input.o src/all_v001/math.o src/all_v001/champ1.o src/all_v001/grille.o src/all_v001/NewSubroutines.o src/all_v001/Tests.o src/all_v001/string.o src/all_v001/io_module.o src/all_v001/precision.o src/core/error.o src/all_v001/matrix_modifications.o src/all_v001/matrix_temp_lowlvl.o src/all_v001/matrix_temp_highlvl.o src/all_v001/read_columbus.o src/all_v001/ortho.o src/all_v001/qp_integrals.o src/all_v001/observable.o src/all_v001/nouveaudrt.o src/all_v001/read_gamess.o src/all_v001/dynamique.o src/main/main.o

像这样的消息错误

src/main/main.f90:471: undefined reference to `zgemm_mkl95_'

但是如果我把编译标志放在最后,那么编译就可以了:

 ifort -o medys src/all_v001/basics.o src/all_v001/variables.o src/all_v001/read_input.o src/all_v001/math.o src/all_v001/champ1.o src/all_v001/grille.o src/all_v001/NewSubroutines.o src/all_v001/Tests.o src/all_v001/string.o src/all_v001/io_module.o src/all_v001/precision.o src/core/error.o src/all_v001/matrix_modifications.o src/all_v001/matrix_temp_lowlvl.o src/all_v001/matrix_temp_highlvl.o src/all_v001/read_columbus.o src/all_v001/ortho.o src/all_v001/qp_integrals.o src/all_v001/observable.o src/all_v001/nouveaudrt.o src/all_v001/read_gamess.o src/all_v001/dynamique.o src/main/main.o -L/opt/intel/composer_xe_2013_sp1.3.174/mkl/lib/intel64 -I/opt/intel/composer_xe_2013_sp1.3.174/mkl/include/intel64/lp64/ -lmkl_intel_lp64 -lmkl_core -lmkl_intel_thread -lpthread -liomp5 -lmkl_blas95_lp64 -lmkl_lapack95_lp64 -nogen-interface -fpe0  -traceback -debug extended -heap-arrays -fp-stack-check -debug all -openmp  -g -L/opt/intel/composer_xe_2013_sp1.3.174/mkl/lib/intel64 -I/opt/intel/composer_xe_2013_sp1.3.174/mkl/include/intel64/lp64/  -lmkl_intel_lp64 -lmkl_core -lmkl_intel_thread -lpthread -liomp5 -lmkl_blas95_lp64 -lmkl_lapack95_lp64

autotools使用以下命令进行编译:

$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f90) $<

我可以更改吗?你有其他建议吗?

1 个答案:

答案 0 :(得分:0)

你的AM_FCFLAGS应该只包含-I标志,即使只有那些对你的构建本地系统结构至关重要的标志(也就是说,所有这些标志最有可能使用$(top_srcdir)

如果要与第三方库链接,则应通过 FCFLAGS的编译器标志(包括-I标志)和LDADD的链接器标志,例如

medys_FCFLAGS = -I/opt/intel/composer_xe_2013_sp1.3.174/mkl/include/intel64/lp64/ -nogen-interface -fpe0  -traceback -debug extended -heap-arrays -fp-stack-check -debug all -openmp
medys_LDADD = -L/opt/intel/composer_xe_2013_sp1.3.174/mkl/lib/intel64 -lmkl_intel_lp64 -lmkl_core -lmkl_intel_thread -lpthread -liomp5 -lmkl_blas95_lp64 -lmkl_lapack95_lp64

或类似的东西。

我是一名C ++程序员,但那里没有太大的区别(我只需要在使用FC的地方使用CXX)。以下是一个好的Makefile.am的示例:https://github.com/CarloWood/ai-xml/blob/master/Makefile.am

如您所见,我的所有第三方库标志,编译器和链接器都是来自configure.ac的AC_SUBST。例如,其中的BOOST *,LIBXML_CFLAGS和LIBXML_LIBS通过在我的configure.ac中包含(使用m4_include())来设置:https://github.com/CarloWood/ai-xml/blob/master/configure.m4