mch*_*hen 3 c cuda header-files
我需要在纯C函数(驻留在main.c中)中调用CUDA C函数foo()(驻留在gpu.cu中).我对此的尝试说明如下:main()
main.c(调用者):
#include "gpu.h"
int main();
int main() { foo(); }
Run Code Online (Sandbox Code Playgroud)gpu.h(foo()声明):<---问题在这里
extern void foo();
Run Code Online (Sandbox Code Playgroud)gpu.cu(foo()定义):
#include "gpu.h"
extern "C" void foo() { ... }
Run Code Online (Sandbox Code Playgroud)我收到错误:
gpu.cu(2): error: linkage specification is incompatible with previous "foo"
gpu.h(1): here
Run Code Online (Sandbox Code Playgroud)但是,如果不使用头文件,以下操作:
main.c(调用者):
void foo();
int main();
int main() { foo(); }
Run Code Online (Sandbox Code Playgroud)gpu.cu(foo()声明和定义):
extern "C" void foo();
extern "C" void foo() { ... }
Run Code Online (Sandbox Code Playgroud)当然,我更喜欢在纯C和CUDA c代码中使用单个头文件,因此在头文件中使用的正确语法是什么(extern "C"即使它是C++的东西,我们仍然需要)吗?我需要.cuh扩展吗?
我正在使用NVCC编译和链接(即纯C和CUDA-C代码).
非常感谢.
你几乎有这个正确 - 问题在于你如何使用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代码,则可能会失败.
你如何选择解决这个问题可能在很大程度上取决于代码的真实结构,我猜这并不像你所描述的那么简单.