Дэн, я написал код CUDA с использованием boost :: program_options в прошлом и оглянулся на него, чтобы увидеть, как я справился с вашей проблемой. Конечно, в цепочке компиляции nvcc есть некоторые причуды. Я полагаю, что вы, как правило, можете справиться с этим, если правильно разложите свои классы и поймете, что часто NVCC не может обрабатывать код / заголовки C ++, но ваш компилятор C ++ может нормально обрабатывать заголовки, связанные с CUDA.
По сути, у меня есть main.cpp, который включает в себя мой заголовок program_options и материал для разбора, определяющий, что делать с опциями. Заголовок program_options затем включает в себя связанные с CUDA прототипы заголовков / классов. Важной частью (как я думаю, вы видели) является отсутствие кода CUDA, а сопровождающие заголовки включают этот заголовок параметров. Передайте ваши объекты в функцию параметров и заполните ее соответствующей информацией. Что-то вроде уродливой версии паттерна стратегии. Сцепленных:
main.cpp:
#include "myprogramoptionsparser.hpp"
(...)
CudaObject* MyCudaObj = new CudaObject;
GetCommandLineOptions(argc,argv,MyCudaObj);
myprogramoptionsparser.hpp:
#include <boost/program_options.hpp>
#include "CudaObject.hpp"
void GetCommandLineOptions(int argc,char **argv,CudaObject* obj){
(do stuff to cuda object) }
CudaObject.hpp:
(do not include myprogramoptionsparser.hpp)
CudaObject.cu:
#include "CudaObject.hpp"
Это может быть немного раздражающим, но компилятор nvcc, кажется, становится лучше в обработке большего количества кода C ++. Это отлично сработало для меня в VC2008 / 2010 и linux / g ++.