我创建了一个类ProcessQueue
:
//ProcessQueue.h
template<class T>
class ProcessQueue{
public:
void addTask(T param);
void clearQueue();
void addSetup(void (*setup)());
void addProcess(void (*process)(T));
void addCleanup(void (*cleanup)());
void setup();
void finish();
private:
//Some private fields and functions that aren't relevant
}
addSetup
和addCleanup
添加在调用setup
和finish
时执行的函数(函数指针随后存储在vector
中,但是无所谓)。 addProcess
应接受输入void
类型变量的T
函数,addTask
将T
类型的变量添加到处理队列。
调用clearQueue
时,该类会迭代已添加的每个T
,并调用已添加到ProcessQueue
的各种“进程”函数。
在另一个文件(kernel.cu
)中,我使用ProcessQueue来处理计算结果:
(请注意,这是host
文件的cu
代码的一部分,因此它是常规C ++。runRecord
只是一个c风格的struct
)< / p>
//kernel.cu
ProcessQueue<runRecord> queue;
#ifdef PRINTTOFILE
queue.addSetup(setupPrintToFile);
queue.addProcess(processPrintToFile);
queue.addCleanup(cleanupPrintToFile);
#endif
#ifdef PRINTRESULTS
queue.addProcess(printRecord);
#endif
queue.setup();
//Do some computation
//Add the results to the ProcessQueue
queue.clearQueue();
queue.finish();
其他一些可能相关的函数声明:
//Various .h files
void setupPrintToFile();
void processPrintToFile(runRecord r);
void cleanupPrintToFile();
void printRecord(runRecord rec);
当我编译它时,我收到一些错误消息:
1>kernel.cu.obj : error LNK2001: unresolved external symbol "public: void __thiscall ProcessQueue<struct runRecord>::addTask(struct runRecord)" (?addTask@?$ProcessQueue@UrunRecord@@@@QAEXUrunRecord@@@Z)
1>kernel.cu.obj : error LNK2001: unresolved external symbol "public: void __thiscall ProcessQueue<struct runRecord>::clearQueue(void)" (?clearQueue@?$ProcessQueue@UrunRecord@@@@QAEXXZ)
1>kernel.cu.obj : error LNK2001: unresolved external symbol "public: void __thiscall ProcessQueue<struct runRecord>::addSetup(void (__cdecl*)(void))" (?addSetup@?$ProcessQueue@UrunRecord@@@@QAEXP6AXXZ@Z)
1>kernel.cu.obj : error LNK2001: unresolved external symbol "public: void __thiscall ProcessQueue<struct runRecord>::addProcess(void (__cdecl*)(struct runRecord))" (?addProcess@?$ProcessQueue@UrunRecord@@@@QAEXP6AXUrunRecord@@@Z@Z)
1>kernel.cu.obj : error LNK2001: unresolved external symbol "public: void __thiscall ProcessQueue<struct runRecord>::addCleanup(void (__cdecl*)(void))" (?addCleanup@?$ProcessQueue@UrunRecord@@@@QAEXP6AXXZ@Z)
1>kernel.cu.obj : error LNK2001: unresolved external symbol "public: void __thiscall ProcessQueue<struct runRecord>::finish(void)" (?finish@?$ProcessQueue@UrunRecord@@@@QAEXXZ)
fatal error LNK1120: 6 unresolved externals
我不太确定问题出在哪里。我已经尝试过更改模板和函数声明,但它似乎没有帮助。
编译器是nvcc v7.5。