使用静态库编译的通用 Gfortran Makefile
Generic Gfortran Makefile to compile with static library
我正在尝试创建一个非常依赖 BLAS 的程序。不过,我之前从未制作过依赖于静态库的可执行文件。到目前为止,我明白我需要使用以下内容制作 BLAS 静态库:
gfortran -O2 -c *.f
ar cr libblas.a *.o
显然在此之后您可以 link 在命令行上使用 -lblas 使用 BLAS 编程。
我的 make 文件如下所示,基本上是从网上复制的:
# ======================================================================
# Declarations
# ======================================================================
# The compiler
FCOMP = gfortran
# flags for debugging or for maximum performance, comment as necessary
FCFLAGS = -g -O2
# libraries needed for linking
LDFLAGS = -lblas
# List of executables to be built within the package
PROGRAM = prog_name_here
# List of subroutines to be built within the package
OBJECTS = foo1.f08 foo2.f08 foo3.f08 ....
# "make" builds all
all: $(PROGRAM)
# ======================================================================
# General Rules
# ======================================================================
# General rule for building prog from prog.o; $^ (GNU extension) is
# used in order to list additional object files on which the
# executable depends
%: %.o
$(FCOMP) $(FCFLAGS) -o $@ $^ $(LDFLAGS)
# General rules for building prog.o from prog.f90 or prog.F90; $< is
# used in order to list only the first prerequisite (the source file)
# and not the additional prerequisites such as module or include files
%.o: %.f08
$(FCOMP) $(FCFLAGS) -c $<
%.o: %.F08
$(FCOMP) $(FCFLAGS) -c $<
%.o: %.f90
$(FCOMP) $(FCFLAGS) -c $<
%.o: %.F90
$(FCOMP) $(FCFLAGS) -c $<
# Utility targets
.PHONY: clean veryclean
clean:
rm -f *.o *.mod *.MOD
veryclean: clean
rm -f *~ $(PROGRAMS)
我显然 link 错误地使用了库,因为我得到了错误:
gfortran -g -O2 -c Consistency_Check.f08
gfortran -g -O2 -o Consistency_Check Consistency_Check.o -lblas
Undefined symbols for architecture x86_64:
"_direct_find_", referenced from:
_MAIN__ in Consistency_Check.o
"_kernel_correction_", referenced from:
_MAIN__ in Consistency_Check.o
"_output_", referenced from:
_MAIN__ in Consistency_Check.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [Consistency_Check] Error 1
rm Consistency_Check.o
有人可以强调如何正确 link 静态库吗?
** 编辑 1 **
我已将 libblas.a 放在与 .f08 / makefile 相同的目录中,以防这是一个相关点
** 编辑 2 **
我注意到从工作目录中删除 libblas.a 没有任何区别。我犯了同样的错误。我不认为它被 makefile 调用/使用。
您必须先 运行 ranlib
blas 存档(库)才能使用它。
gfortran -O2 -c *.f
ar cr libblas.a *.o
ranlib libblas.a
有用link:https://superuser.com/questions/404603/what-is-ranlib
正如其他人所说,您看到的 link 错误与 libblas
无关
但是你自己的代码。
我怀疑你的 makefile 看起来像你发布的那个
那个根本没有定义制作 $(PROGRAM)
的规则,所以它
甚至不会达到 link年龄错误。
试试这样的:
FCOMP = gfortran
FCFLAGS = -g -O2
LDFLAGS = -lblas
PROGRAM = prog_name_here
SRCS = foo1.f08 foo2.f08 foo3.f08 ...
OBJECTS = $(SRCS:.f08=.o)
all: $(PROGRAM)
$(PROGRAM): $(OBJECTS)
$(FCOMP) $(FCFLAGS) -o $@ $^ $(LDFLAGS)
%.o: %.f08
$(FCOMP) $(FCFLAGS) -c $<
.PHONY: clean veryclean
clean:
rm -f *.o *.mod *.MOD
veryclean: clean
rm -f *~ $(PROGRAM)
(注意将拼写错误 $(PROGRAMS)
更正为 $(PROGRAM)
veryclean
规则)。
至于 linking libblas
作为静态库,目前尚不清楚在哪里或为什么
你正在这样做,因为 a) 你的 makefile 没有构建它并且 b)
您的 linux 发行版几乎肯定会将其作为共享库提供
您可以安装的软件包。但是,如果你想构建它
然后 link 它静态地(这样做了),你的 makefile 必须告诉
linker 使用 L
linker 选项搜索 libblas.a
的目录。
因此,将您的 LDFLAGS
更改为:
LDFLAGS = -L/path/to/your/liblas/build -lblas
如果您在 运行 和 make
所在的目录中构建 libblas.a
,那么:
LDFLAGS = -L. -lblas
我正在尝试创建一个非常依赖 BLAS 的程序。不过,我之前从未制作过依赖于静态库的可执行文件。到目前为止,我明白我需要使用以下内容制作 BLAS 静态库:
gfortran -O2 -c *.f
ar cr libblas.a *.o
显然在此之后您可以 link 在命令行上使用 -lblas 使用 BLAS 编程。
我的 make 文件如下所示,基本上是从网上复制的:
# ======================================================================
# Declarations
# ======================================================================
# The compiler
FCOMP = gfortran
# flags for debugging or for maximum performance, comment as necessary
FCFLAGS = -g -O2
# libraries needed for linking
LDFLAGS = -lblas
# List of executables to be built within the package
PROGRAM = prog_name_here
# List of subroutines to be built within the package
OBJECTS = foo1.f08 foo2.f08 foo3.f08 ....
# "make" builds all
all: $(PROGRAM)
# ======================================================================
# General Rules
# ======================================================================
# General rule for building prog from prog.o; $^ (GNU extension) is
# used in order to list additional object files on which the
# executable depends
%: %.o
$(FCOMP) $(FCFLAGS) -o $@ $^ $(LDFLAGS)
# General rules for building prog.o from prog.f90 or prog.F90; $< is
# used in order to list only the first prerequisite (the source file)
# and not the additional prerequisites such as module or include files
%.o: %.f08
$(FCOMP) $(FCFLAGS) -c $<
%.o: %.F08
$(FCOMP) $(FCFLAGS) -c $<
%.o: %.f90
$(FCOMP) $(FCFLAGS) -c $<
%.o: %.F90
$(FCOMP) $(FCFLAGS) -c $<
# Utility targets
.PHONY: clean veryclean
clean:
rm -f *.o *.mod *.MOD
veryclean: clean
rm -f *~ $(PROGRAMS)
我显然 link 错误地使用了库,因为我得到了错误:
gfortran -g -O2 -c Consistency_Check.f08
gfortran -g -O2 -o Consistency_Check Consistency_Check.o -lblas
Undefined symbols for architecture x86_64:
"_direct_find_", referenced from:
_MAIN__ in Consistency_Check.o
"_kernel_correction_", referenced from:
_MAIN__ in Consistency_Check.o
"_output_", referenced from:
_MAIN__ in Consistency_Check.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [Consistency_Check] Error 1
rm Consistency_Check.o
有人可以强调如何正确 link 静态库吗?
** 编辑 1 ** 我已将 libblas.a 放在与 .f08 / makefile 相同的目录中,以防这是一个相关点
** 编辑 2 ** 我注意到从工作目录中删除 libblas.a 没有任何区别。我犯了同样的错误。我不认为它被 makefile 调用/使用。
您必须先 运行 ranlib
blas 存档(库)才能使用它。
gfortran -O2 -c *.f
ar cr libblas.a *.o
ranlib libblas.a
有用link:https://superuser.com/questions/404603/what-is-ranlib
正如其他人所说,您看到的 link 错误与 libblas
无关
但是你自己的代码。
我怀疑你的 makefile 看起来像你发布的那个
那个根本没有定义制作 $(PROGRAM)
的规则,所以它
甚至不会达到 link年龄错误。
试试这样的:
FCOMP = gfortran
FCFLAGS = -g -O2
LDFLAGS = -lblas
PROGRAM = prog_name_here
SRCS = foo1.f08 foo2.f08 foo3.f08 ...
OBJECTS = $(SRCS:.f08=.o)
all: $(PROGRAM)
$(PROGRAM): $(OBJECTS)
$(FCOMP) $(FCFLAGS) -o $@ $^ $(LDFLAGS)
%.o: %.f08
$(FCOMP) $(FCFLAGS) -c $<
.PHONY: clean veryclean
clean:
rm -f *.o *.mod *.MOD
veryclean: clean
rm -f *~ $(PROGRAM)
(注意将拼写错误 $(PROGRAMS)
更正为 $(PROGRAM)
veryclean
规则)。
至于 linking libblas
作为静态库,目前尚不清楚在哪里或为什么
你正在这样做,因为 a) 你的 makefile 没有构建它并且 b)
您的 linux 发行版几乎肯定会将其作为共享库提供
您可以安装的软件包。但是,如果你想构建它
然后 link 它静态地(这样做了),你的 makefile 必须告诉
linker 使用 L
linker 选项搜索 libblas.a
的目录。
因此,将您的 LDFLAGS
更改为:
LDFLAGS = -L/path/to/your/liblas/build -lblas
如果您在 运行 和 make
所在的目录中构建 libblas.a
,那么:
LDFLAGS = -L. -lblas