【问题标题】:Can one have a mixed makefile with .c and and .cu files? if so, how?可以使用 .c 和 .cu 文件混合生成文件吗?如果是这样,如何?
【发布时间】:2021-08-03 12:18:16
【问题描述】:

我目前有一个用于编译 OpenACC 的 makefile,我想知道是否可以让它也支持 .cu

我现在的makefle:

LDFLAGS += -Ldcmt0.4/lib -ldcmt
include Makefile.include


HW1_INCS = black_scholes.h gaussian.h parser.h random.h timer.h util.h
HW1_C_SRCS = black_scholes.c gaussian.c main.c parser.c random.c dcmt0.4/lib/random_seed.c timer.c util.c
HW1_C_OBJS = $(HW1_C_SRCS:.c=.o)
HW1_EXE = hw1.x

all: hw1.x

%.o: %.c
    $(CC) -c $(CCFLAGS) $(ACCFLAGS) $< -o $@

hw1.x: $(HW1_C_OBJS) dcmt0.4/lib/libdcmt.a
    $(CC) $(LDFLAGS) $(HW1_C_OBJS) -o $@

dcmt0.4/lib/libdcmt.a: 
    make -C dcmt0.4/lib
black_scholes.o: black_scholes.c black_scholes.h gaussian.h random.h util.h
gaussian.o: gaussian.c gaussian.h util.h
main.o: main.c black_scholes.h parser.h random.h timer.h
parser.o: parser.c parser.h
random.o: random.c random.h
dcmt0.4/lib/random_seed.o: dcmt0.4/lib/random_seed.c
timer.o: timer.c timer.h
util.o: util.c util.h

clean:
    make -C dcmt0.4/lib clean
    rm -f $(HW1_C_OBJS) $(HW1_EXE)

Makefile.include:

CC = nvc
LINKER = nvc
LDFLAGS = -lm

我计划将 Cuda 包含在 black_scholes.c 中,这样它就会变成 black_scholes.cu,而其他东西则保持原样。但是,我不确定是否可以在单个 makefile 中执行此操作,而且我对它们非常陌生。

例如,HW1_C_SRCSHW1_C_OBJS 包含 .c 扩展名,但我必须将 black_scholes 更改为 .c

同样,编译器标志也会有机会,任何指导都将不胜感激

【问题讨论】:

  • “我计划将 Cuda 包含在 black_scholes.c 中”——你不能这样做。 nvcc 使用文件扩展名来确定编译路径,如果您保留 .c 扩展名,它将移交给主机编译器并无法编译。另请注意,CUDA 代码是使用 C++ 链接编译的,因此您必须处理损坏的符号或修改 CUDA 代码来为您从 C 代码调用的所有内容指定 C 链接
  • 我会把它改成 black_scholes.cu,对不起,我在答案中打错了,但我不知道如何相应地修改 makefile
  • @Sergio 我提供的解决方案对你有用

标签: c makefile cuda


【解决方案1】:

请找到下面的代码,您可以在同一个 makefile 中使用它来编译所有文件(.c 和 .cu)。

LDFLAGS += -Ldcmt0.4/lib -ldcmt
include Makefile.include


HW1_INCS = black_scholes.h gaussian.h parser.h random.h timer.h util.h
# Add your .c files here
HW1_C_SRCS = gaussian.c main.c parser.c random.c
# Add your .cu files here
HW1_CUDA_SRCS = black_scholes.cu
HW1_C_OBJS = $(HW1_C_SRCS:.c=.o)
HW1_CUDA_OBJS = $(HW1_CUDA_SRCS:.cu=.o)
HW1_EXE = hw1.x

all: hw1.x

%.o: %.c
    $(CC) -c $(CCFLAGS) $(ACCFLAGS) $< -o $@

%.o: %.cu
    # Here you can also put a variable CUDAFLAGS instead of CCFLAGS if you want to pass
    # different compiler flags to .cu file. You can define the variable CUDAFLAGS in makefile.include
    $(CC) -c $(CCFLAGS) $(ACCFLAGS) $< -o $@

hw1.x: $(HW1_C_OBJS) $(HW1_CUDA_OBJS) dcmt0.4/lib/libdcmt.a
    $(CC) $(LDFLAGS) $(HW1_C_OBJS) $(HW1_CUDA_OBJS) -o $@

dcmt0.4/lib/libdcmt.a: 
    make -C dcmt0.4/lib

black_scholes.o: black_scholes.cu black_scholes.h gaussian.h random.h util.h
gaussian.o: gaussian.c gaussian.h util.h
main.o: main.c black_scholes.h parser.h random.h timer.h
parser.o: parser.c parser.h
random.o: random.c random.h
dcmt0.4/lib/random_seed.o: dcmt0.4/lib/random_seed.c
timer.o: timer.c timer.h
util.o: util.c util.h

clean:
    make -C dcmt0.4/lib clean
    rm -f $(HW1_C_OBJS) $(HW1_CUDA_OBJS) $(HW1_EXE)

请注意:这只是帮助您入门的示例。
跑步 : 全力以赴

【讨论】:

  • 我使用这两个命令得到了以下结果:“make: *** No rule to make target 'black_scholes.c', 'black_scholes.o' 需要。停止。”
  • @sergio : 这意味着 black_scholes.c 文件不可用于制作。请检查该文件是否存在。我为您提供了一个参考示例,说明如何使用开关并根据它切换条件。通过这种方式,您可以实现使用相同 makefile 的功能。
  • 它不存在,因为我将 cuda 代码放入其中并将其切换为 .cu,我应该扩展吗?
  • 对不起,现在我有点困惑。所以你创建一个.cu扩展名的文件并保存它,然后你想让这个.cu文件编译?
  • 是的,我有 black_scholes.cu 和 gaussian.c main.c parser.c random.c 我希望全部编译
猜你喜欢
  • 1970-01-01
  • 2012-06-08
  • 2013-11-17
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 2015-01-10
  • 2017-10-25
相关资源
最近更新 更多