Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Makefile中使用notdir、通配符和patsubst?_Makefile_Gnu Make_Pgi_Makefile Errors - Fatal编程技术网

如何在Makefile中使用notdir、通配符和patsubst?

如何在Makefile中使用notdir、通配符和patsubst?,makefile,gnu-make,pgi,makefile-errors,Makefile,Gnu Make,Pgi,Makefile Errors,我有以下生成文件: #.SUFFIXES: #.SUFFIXES: .F90 .cuf .o ROOT = /home/ccevallos/finalMIT SRCDIR := $(ROOT)/external/lib_eigesolve #F90SRC = $(notdir $(wildcard $(SRCDIR)/*.F90)) #F90OBJS = $(patsubst %.F90,%.o,$(F90SRC)) F90OBJS = eigsolve_vars.o toolbox.o

我有以下生成文件:

#.SUFFIXES:
#.SUFFIXES: .F90 .cuf .o

ROOT = /home/ccevallos/finalMIT

SRCDIR := $(ROOT)/external/lib_eigesolve

#F90SRC = $(notdir $(wildcard $(SRCDIR)/*.F90))
#F90OBJS = $(patsubst %.F90,%.o,$(F90SRC))
F90OBJS = eigsolve_vars.o toolbox.o zhegst_gpu.o zhemv_gpu.o zhetd2_gpu.o zhetrd_gpu.o zheevd_gpu.o zhegvdx_gpu.o \
          dsygst_gpu.o dsymv_gpu.o dsytd2_gpu.o dsytrd_gpu.o dsyevd_gpu.o dsygvdx_gpu.o
#CUFSRC = $(notdir $(wildcard $(SRCDIR)/*.cuf))
#CUFOBJS = $(patsubst %.cuf,%.o,$(CUFSRC))
CUFOBJS = cusolverDn_m.o

FLAGS = -O3 -mp -pgf90libs -Mcuda=cc60,cuda9.1,ptxinfo -Mlarge_arrays
FLAGS2 = -O3 -mp -pgf90libs -Mcuda=cc60,cuda9.1,ptxinfo,maxregcount:64 -Mlarge_arrays
FLAGS3 = -O3 -mp -pgf90libs -Mcuda=cc60,cuda9.1,ptxinfo,nordc,maxregcount:255  -Mlarge_arrays

.PHONY: all
all: lib_eigsolve.a

zhetd2_gpu.o : zhetd2_gpu.F90
    pgf90 -c ${FLAGS2} ${OPTFLAGS} $*.F90 -o $*.o 
zhemv_gpu.o : zhemv_gpu.F90
    pgf90 -c ${FLAGS3} ${OPTFLAGS} $*.F90 -o $*.o
dsytd2_gpu.o : dsytd2_gpu.F90
    pgf90 -c ${FLAGS2} ${OPTFLAGS} $*.F90 -o $*.o
dsymv_gpu.o : dsymv_gpu.F90
    pgf90 -c ${FLAGS3} ${OPTFLAGS} $*.F90 -o $*.o
cusolverDn_m.o: cusolverDn_m.cuf
    pgf90 -c ${FLAGS}  ${OPTFLAGS} $*.cuf -o $*.o
%.o: %.F90
    pgf90 -c ${FLAGS}  ${OPTFLAGS} $*.F90 -o $*.o

lib_eigsolve.a: $(F90OBJS) $(CUFOBJS)
    ar rcs $@ $^


PHONY: clean
clean:
    rm -f lib_eigsolve.a *.mod *.o
这个makefile编译得非常好,但是我基本上想用#取消对行的注释,以使其更简单,但是当我这样做时

ar rcs lib_eigsolve.a 
出现在终端中,未创建对象文件,因此lib_eigsolve.a为空。。。 为什么不编译目标文件

另外,您可以在此处找到此Makefile,并进行一些修改

确保$(SRCDIR)没有空格:

SRCDIR := $(strip ${SRCDIR})
ifneq (1,$(words ${SRCDIR}))
  $(error Not without further fiddling, friend)
endif
确保$(SRCDIR)没有空格:

SRCDIR := $(strip ${SRCDIR})
ifneq (1,$(words ${SRCDIR}))
  $(error Not without further fiddling, friend)
endif

在通配符表达式中指定路径看起来很奇怪。当您直接在srcdir中执行make时(
make-C lib_eigsolve
),您应该编写

F90SRC = $(notdir $(wildcard *.F90))


当您希望保留树外生成选项时。

在通配符表达式中指定路径看起来很奇怪。当您直接在srcdir中执行make时(
make-C lib_eigsolve
),您应该编写

F90SRC = $(notdir $(wildcard *.F90))


当您想保留树外构建选项时。

您在
$(SRCDIR)
中有一个简单的输入错误:
Eigensolver\u gpu
中的源目录称为
lib\u eigsolve
而不是
lib\u eigesolve

$cd~工作区/操场
$git克隆https://github.com/NVIDIA/Eigensolver_gpu.git
$ls\gpu/
lib_eigsolve LICENSE README.md测试驱动程序
然后,我继续通过复制和粘贴问题中的相关行来创建一个虚拟makefile:

ROOT:=$(家庭)/工作区/游乐场/特征解算器\gpu
ifndef固定
SRCDIR:=$(根)/lib_eigesolve
其他的
SRCDIR:=$(根)/lib_eigsolve
恩迪夫
F90SRC=$(notdir$(通配符$(SRCDIR)/*.F90))
$(信息F90SRC'$(F90SRC'))
F90OBJS=$(patsubst%.F90,%.o,$(F90SRC))
$(信息F90OBJS'$(F90OBJS'))
CUFSRC=$(notdir$(通配符$(SRCDIR)/*.cuf))
$(信息CUFSRC'$(CUFSRC)’)
CUFOBJS=$(patsubst%.cuf、%.o、$(CUFSRC))
$(信息CUFOBJS'$(CUFOBJS))
lib_eigsolve.a:$(F90OBJS)$(CUFOBJS)
回声雷达rcs$@$^
测试运行:

$make
F90SRC“
F90OBJS“”
中大“
CUFOBJS“
echo ar rcs lib_eigsolve.a
ar rcs lib_eigsolve.a
$make FIXED=1
F90SRC'dsyevd\U gpu.F90。。。zhemv_gpu.F90'
F90OBJS的dsyevd\U gpu.o。。。zhemv_gpu.o'
CUFSRC‘cusolverDn_m.cuf’
CUFOBJS'cusolverDn_m.o'
make:**“lib\u eigsolve.a”需要将目标设置为“dsyevd\u gpu.o”没有规则。停止

您在
$(SRCDIR)
中有一个简单的输入错误:
Eigensolver\u gpu
中的源目录称为
lib\u eigsolve
而不是
lib\u eigesolve

$cd~工作区/操场
$git克隆https://github.com/NVIDIA/Eigensolver_gpu.git
$ls\gpu/
lib_eigsolve LICENSE README.md测试驱动程序
然后,我继续通过复制和粘贴问题中的相关行来创建一个虚拟makefile:

ROOT:=$(家庭)/工作区/游乐场/特征解算器\gpu
ifndef固定
SRCDIR:=$(根)/lib_eigesolve
其他的
SRCDIR:=$(根)/lib_eigsolve
恩迪夫
F90SRC=$(notdir$(通配符$(SRCDIR)/*.F90))
$(信息F90SRC'$(F90SRC'))
F90OBJS=$(patsubst%.F90,%.o,$(F90SRC))
$(信息F90OBJS'$(F90OBJS'))
CUFSRC=$(notdir$(通配符$(SRCDIR)/*.cuf))
$(信息CUFSRC'$(CUFSRC)’)
CUFOBJS=$(patsubst%.cuf、%.o、$(CUFSRC))
$(信息CUFOBJS'$(CUFOBJS))
lib_eigsolve.a:$(F90OBJS)$(CUFOBJS)
回声雷达rcs$@$^
测试运行:

$make
F90SRC“
F90OBJS“”
中大“
CUFOBJS“
echo ar rcs lib_eigsolve.a
ar rcs lib_eigsolve.a
$make FIXED=1
F90SRC'dsyevd\U gpu.F90。。。zhemv_gpu.F90'
F90OBJS的dsyevd\U gpu.o。。。zhemv_gpu.o'
CUFSRC‘cusolverDn_m.cuf’
CUFOBJS'cusolverDn_m.o'
make:**“lib\u eigsolve.a”需要将目标设置为“dsyevd\u gpu.o”没有规则。停止

你有没有检查过当你说“make”时执行的是不是真的GNUmake?你有没有检查过当你说“make”时执行的是不是真的GNUmake?是的,不幸的是这不是问题:(是的,不幸的是这不是问题:(是的,我在一段时间后意识到了拼写错误。“无规则生成目标”的问题这是因为某种原因,我必须指定对象和源文件的完整路径。但是非常感谢!:)是的,我在一段时间后意识到了打字错误。“无规则设置目标”的问题是,出于某种原因,我必须指定对象和源文件的完整路径。但是非常感谢!:)