我想在常规旧C中编写一些主机辅助函数,将其包含在.cu文件中,该文件运行部分主机代码并定义和调用内核函数。我对makefile没有任何了解,对一般的多文件项目也没有好感,也无法理解为什么以下工作时使用.c扩展名但是使用.cu扩展名失败。
A.H
void sayhello();
A.C:
#include "A.h"
#include <stdio.h>
void sayhello() {
printf("Hello from A\n");
}
B.c:
#include "A.h"
int main(int argc, char * argv) {
sayhello();
return 0;
}
B.cu
#include "A.h"
int main(int argc, char * argv[]) {
sayhello();
return 0;
}
当我编译A.c时一切正常:
$ nvcc -arch compute_30 -code sm_30 -o test B.c A.c
$ ./test
Hello from A
但是当尝试编译B.cu时,链接器找不到sayhello()
$ nvcc -o test B.cu A.c
/tmp/tmpxft_000017bb_00000000-16_B.o: In function 'main':
tmpxft_000017bb_00000000-4_B.cudafe1.cpp:(.text+0x26): undefined reference to 'sayhello()'
collect2: error: ld returned 1 exit status
为什么不找到sayhello(),这些编译之间有什么区别,是否有编译此结构代码的解决方案?
答案 0 :(得分:2)
CUDA使用C ++编译器编译.cu
个文件。因此,除非另有明确说明,否则它期望.cu
文件中引用的所有函数都具有C ++链接。在您的情况下,您必须以其他方式明确指示C ++编译器。
您应该发现修改代码如下:
extern "C" {
#include "A.h"
}
int main(int argc, char * argv[]) {
sayhello();
return 0;
}
将解决问题,因为它将指示编译器期望C函数的C链接,而不是C ++链接。
答案 1 :(得分:-2)
您需要在sayhello函数上使用__host__ __device__
装饰。
另外,在A.h
中包含cuda_runtime.h