如何在纯C和CUDA C文件中包含头文件?

mch*_*hen 3 c cuda header-files

我需要在纯C函数(驻留在main.c中)中调用CUDA C函数foo()(驻留在gpu.cu中).我对此的尝试说明如下:main()

但是,如果不使用头文件,以下操作:

当然,我更喜欢在纯C和CUDA c代码中使用单个头文件,因此在头文件中使用的正确语法是什么(extern "C"即使它是C++的东西,我们仍然需要)吗?我需要.cuh扩展吗?

我正在使用NVCC编译和链接(即纯C和CUDA-C代码).

非常感谢.

tal*_*ies 5

你几乎有这个正确 - 问题在于你如何使用gpu.h.工具链报告的冲突正在发生,因为gpu.cu声明中包含的头文件foo()将具有C++链接,但该定义具有C链接.

基本问题是您尝试使用gpu.hC和C++标头.这通常不是一个好主意,但可以使它工作.一种方法是确定它是一个C头文件并修改C++代码将其视为一个,所以这样gpu.cu做:

extern "C" {
#include "gpu.h"
}

extern "C" void foo() { ... };
Run Code Online (Sandbox Code Playgroud)

另一个是修改,gpu.h以便它的行为是不同的,这取决于它是由C编译器还是C++编译器包含,所以类似于:

#ifdef __cplusplus
extern "C" {
#endif
extern void foo();
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

要么

#ifdef __cplusplus
extern "C" void foo();
#else
void foo();
#endif
Run Code Online (Sandbox Code Playgroud)

会使预处理器发出不同的代码,具体取决于代码是在C或C++环境中编译.但是,如果您尝试使用C++编译器编译任何一个名义上的C代码,则可能会失败.

你如何选择解决这个问题可能在很大程度上取决于代码的真实结构,我猜这并不像你所描述的那么简单.