C++ 为什么nvcc无法使用boost::spirit编译CUDA文件?

C++ 为什么nvcc无法使用boost::spirit编译CUDA文件?,c++,boost,cuda,boost-spirit,nvcc,C++,Boost,Cuda,Boost Spirit,Nvcc,我正在尝试将CUDA集成到使用boost::spirit的现有应用程序中 隔离问题后,我发现以下代码不能与nvcc复制: main.cu: #include <boost/spirit/include/qi.hpp> int main(){ exit(0); } #包括 int main(){ 出口(0); } 使用nvcc-ocudatest main.cu编译时,我会看到很多错误 但是,如果我将文件名更改为main.cpp,并使用nvcc再次编译,它就会工作。这里发生

我正在尝试将CUDA集成到使用boost::spirit的现有应用程序中

隔离问题后,我发现以下代码不能与nvcc复制:

main.cu

#include <boost/spirit/include/qi.hpp>
int main(){
    exit(0);
}
#包括
int main(){
出口(0);
}
使用
nvcc-ocudatest main.cu编译时,我会看到很多错误


但是,如果我将文件名更改为
main.cpp
,并使用
nvcc
再次编译,它就会工作。这里发生了什么?我如何修复它?

nvcc
有时在编译复杂的模板代码时会遇到问题,例如在Boost中找到的代码,即使该代码仅用于
\uuuuuuu主机
函数

当文件扩展名为
.cpp
时,
nvcc
本身不执行解析,而是将代码转发给主机编译器,这就是为什么您会根据文件扩展名观察到不同的行为

如果可能,尝试将依赖于Boost的代码隔离到
nvcc
不需要解析的.cpp
文件中


我也会确保尝试最近发布的
nvcc
nvcc
的模板支持随着每个版本而改进。

如果扩展名不是.cpp,nvcc是否假定它是C代码,和C++如果它可能是?@ Ad林地:这是极不可能的,因为错误是关于模板参数的。我通常解决的方法是把我的控制代码放在纯代码> > CPP < /代码>文件中,我用我的标准编译器处理,它调用在文件中单独实现的特定函数。这很有效。我通常会像Kerrek SB所说的那样隔离CUDA代码,但问题是现在我需要使用
.h
文件中的一些类定义,其中包括boost spirit,我不知道如何对
nvcc
隐藏spirit,因为这个类使用它。Jared Hoberock我正在使用CUDA 4.0编译工具。不知道升级到4.1是否能解决这个问题,但我会在其他一切都不起作用时尝试。@Vik:您可以研究是否可以应用pimpl模式来解决类定义中的问题:@JaredHoberock,这个解决方法解决了我的问题,谢谢。但这看起来像是一个nvcc错误。希望它得到修复,为其他人节省时间。@masterxilo尝试使用Eigen 3.3(目前为rc1)。它仍然会生成很多警告,但至少它可以编译(至少是我测试过的少数东西)。有关我的测试设置,请参阅。