我在应用程序中有两个版本的函数,一个在CUDA中实现,另一个在标准C中实现。它们在单独的文件中,让我们说 cudafunc.h 和 func.h (实现在 cudafunc.cu 和 func.c )。我想在编译应用程序时提供两个选项。如果此人安装了nvcc,则会编译 cudafunc.h 。否则,它将编译 func.h 。
无论如何检查机器是否在makefile中安装了nvcc,从而相应地调整编译器?
非常感谢,
答案 0 :(得分:2)
你可以试试条件,比如
ifeq (($shell which nvcc),) # No 'nvcc' found
func.o: func.c func.h
HEADERS += func.h
else
func.o: cudafunc.cu cudafunc.h
nvcc -o $@ -c $< . . .
CFLAGS += -DUSE_CUDA_FUNC
HEADERS += cudafunc.h
endif
然后在将调用此函数的代码中,它可以测试#if USE_CUDA_FUNC
以决定要包含哪个标头以及要调用哪个接口。
答案 1 :(得分:0)
这应该有效,包含在Makefile中:
NVCC_RESULT := $(shell which nvcc 2> NULL)
NVCC_TEST := $(notdir $(NVCC_RESULT))
ifeq ($(NVCC_TEST),nvcc)
CC := nvcc
else
CC := g++
endif
test:
@echo $(CC)
对于GNU make,配方行(test:
之后)实际上以制表符开头。
使用上面的序言,您可以使用基于CC
变量的conditionals来控制Makefile的剩余部分。
您可以将test:
目标更改为您想要有条件地构建的目标。
作为测试,只需使用make
运行上述内容即可。您应该根据检测到的内容获得nvcc
或g++
的输出。