[英]How to create a makefile for several .cpp files with .h files and main.cpp without a .h
[英]How to create alias for cpp and h files (and ignoring compiler __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*/ }
};
ELSE://具有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,但通常可以通过#definable如果未设置该标志,将符号扩展为空值来使这些事情看起来更好:
#if defined(CCOMPILE_WITH_GPU)
#define MY_ATTRIBUTE xxx
#endif
MY_ATTRIBUTE void func();
而不是将#ifdef放在每个函数声明周围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.