如何为 cpp 和 h 文件创建别名,以便 GCC 可以编译不同命名后缀的文件?
如何使 GCC 忽略某些编译器属性,而不必将它们包装在 #ifdef
和 #endif
语句中?
阐述:
我正在使用 CUDA 编写一个库,我希望能够在 CPU 和 GPU 上创建相同的对象。
如果用户没有NVCC(这是一个仅标题库(,我希望用户能够使用GCC进行编译。
无论如何,我可以让 GCC 编译.cu
和.cuh
文件,同时忽略__host__
__device__
和__global__
编译器属性,而不必简单地包装所有
之: #ifdef #endif
声明中的__host__
__device__
和__global__
?
IE:#ifdef NVCC//让NVCC这样解释.cu
文件
__host__ __device__
struct foo {
foo() {/*impl*/ }
};
否则://让 GCC/Clang/etc 这样解释.cu
文件(以及.h
文件(:
struct foo {
foo() {/*impl*/ }
};
所有位置的头文件中执行以下操作:
#ifdef __CUDACC__
#define CUDAHOSTDEV __host__ __device__
#else
#define CUDAHOSTDEV
#endif
然后,无论您在哪里使用
__host__ __device__
你只是使用
CUDAHOSTDEV
我不知道这是否更容易,但如果你从头开始写东西,它可能更少打字。
您可以在此处看到一些特定于 CUDA 的nvcc
编译器定义。
此外,我很确定您可以将-x
开关传递给 gcc/g++,以告诉它独立于文件后缀识别/使用哪种语言。
您可能还想查看一个现有的"高质量"CUDA 模板库,例如推力,看看它们的作用。
您将需要在某处 #ifdef//#endif,但是如果未设置标志,则通常可以通过 #defining 符号扩展到空值来使这些东西看起来更好:
#if defined(CCOMPILE_WITH_GPU)
#define MY_ATTRIBUTE xxx
#endif
MY_ATTRIBUTE void func();
而不是在每个函数声明周围放置 #ifdef。