在阅读Managing Projects with GNU Make的前几章后,我提出了我的第一个非平凡的Makefile
all: libTest.a
libTest.a : Test.o MWE.o Test.dlink.o MWE.dlink.o
nvcc -ccbin g++ -m64 -gencode arch=compute_30,code=sm_30 -lib -o $@ $^
%.a : %.dlink.o %.o
nvcc -ccbin g++ -m64 -gencode arch=compute_30,code=sm_30 -lib -o $@ $^
%.dlink.o : %.o
nvcc -ccbin g++ -m64 -gencode arch=compute_30,code=sm_30 -dlink -o $@ $<
%.o: %.cu
nvcc -ccbin g++ -m64 -gencode arch=compute_30,code=sm_30 -dc -o $@ -c $<
clean:
rm -f *.o *.dlink.o
这个Makefile有效但我真的不喜欢将中间文件Test.o MWE.o Test.dlink.o MWE.dlink.o
指定为libTest
的先决条件。我宁愿指定输入文件Test.cu
和MWE.cu
,或者更好地指定通配符%.u
。
答案 0 :(得分:1)
只要您可以准备一个命令(或一组命令)来构建来自libTest.a
和Test.cu
的{{1}},您就可以拥有一条规则:
MWE.cu
但这不是使用libTest.a: Test.cu MWE.cu
list
of
commands
needed
to
build
the
library
的合理方法。你在原始问题中向我们展示的是make
- 做事的方式。但是,如果您的整个make
规则Makefile
在这里是多余的。
您可以做的是自动生成这些先决条件:
%.a : %.dlink.o %.o
如果您不想手动将文件名添加到SOURCES=Test.cu MWE.cu
libTest.a: $(SOURCES:%.cu=%.o) $(SOURCES:%.cu=%.dlink.o)
nvcc -ccbin g++ -m64 -gencode arch=compute_30,code=sm_30 -lib -o $@ $^
但更喜欢使用当前目录中提供的所有SOURCES
文件,请将*.cu
作业替换为:
SOURCES