我一直在尝试编译一组C和CUDA代码。当我创建文件时,问题在于编译的链接阶段。我创建了一个在主机上执行的包装函数,用于在设备上分配内存,将数据复制到它,以及运行内核代码。此外,包装器代码包含在与内核代码相同的文件中。包装器。以下是代码调用函数的方式:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "LAMMPS.h"
...
main(int argc, char **argv)
{
...
tortuosityTotal = gradient(nbAtoms, topAtoms, bottomAtoms, nTop, nBottom, allConnections, atomlist, ysize);
这是头文件中的函数定义&#34; LAMMPS.h&#34;我做了:
float gradient(unsigned short nbAtoms, unsigned short *topAtoms,unsigned short
*bottomAtoms, unsigned short nTop, unsigned short nBottom, struct connection
**allConnections,struct atoms *atomlist, double *ysize);
这是我正在使用的makefile:
all: tortGPU
tortGPU: gradient_kernel.o buildNeighborList.o dumpRead.o tortuosityGPU.c
nvcc tortuosityGPU.c buildNeighborList.o dumpRead.o gradient_kernel.o -lm -o tortGPU
buildNeighborList.o: dumpRead.o buildNeighborList.c
gcc -c buildNeighborList.c
dumpRead.o: dumpRead.c
gcc -c dumpRead.c
gradient_kernel.o:
nvcc -c gradient_kernel.cu -arch=sm_20
clean: rm -rf *.o program
最后,编译步骤工作正常,但是当我将它们全部链接在一起时(使用tortGPU的最后一步,我收到以下错误消息:
/tmp/tmpxft_000068c7_00000000-1_tortuosityGPU.o: In function `main':
tortuosityGPU.c:(.text+0x520): undefined reference to `gradient'
collect2: ld returned 1 exit status
make: *** [tortGPU] Error 1
我尝试使用带有-L的gcc并获得完全相同的错误代码。 谢谢!
答案 0 :(得分:3)
尽管该语言通常称为cuda-C
,但将其称为cuda-C++
更为正确,因为nvcc
是C ++编译器。名为gradient
的函数正在进行C ++名称修改(或者更确切地说,nvcc
正在查找损坏的名称)。您可以使用extern "C"
包装声明,也可以将代码编译为C ++。