如何为 cpp 和 h 文件创建别名(并忽略编译器__attributes__)



如何为 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。

最新更新