这是我的制作文件输出:
nvcc -c -arch=sm_35 src/kmeans_cuda.cu
nvcc -c -arch=sm_35 src/sequence.c
nvcc -c -arch=sm_35 src/io.c
nvcc -c -arch=sm_35 src/main.c
nvcc -g -o cuda-means kmeans_cuda.o sequence.o io.o main.o
Undefined symbols for architecture x86_64:
"_kmeans", referenced from:
_main in main.o
(maybe you meant: cudaError (anonymous namespace)::cudaLaunch<char>(char*))
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [all] Error 1
在我的主函数上,我调用kmeans();
kmeans,是一个在kmeans_cuda.cu中定义的C函数
void kmeans() {
long i,h,j,k; //counters
long delta; //Number of objects has diverged in current iteration
long nearest; //Nearest centroid
unsigned int distance,min_distance; //distance calculated by relation point-cluster
int *count,*recv_count;
int *send_label;
double begin,end,trans_init,trans_end;
// should call kernel, but is not calling yet, because it's not implemented ...
我已经尝试在 kmeans() 声明中添加__host__
,但并没有解决问题。我现在知道为什么会出现此错误,因为我正在将对象与函数链接。
nvcc 将.cu
文件视为C++文件,并且您的主机代码位于.c
文件中(即在 C 中,而不是 C++ 中)。
最简单的解决方案是简单地将.c
文件重命名为.cpp
,并将应用视为C++应用而不是 C。您还可以将kmeans()
声明为 extern "C" {...}
,以强制编译器对函数使用 C 绑定而不是C++绑定,但随后您必须为每个可能不必要不优雅的未来函数执行此操作。