使用函数指针作为参数调用函数时未解析的外部符号(LNK2001)

时间:2016-08-04 15:41:47

标签: c++ templates cuda

我创建了一个类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
}

addSetupaddCleanup添加在调用setupfinish时执行的函数(函数指针随后存储在vector中,但是无所谓)。 addProcess应接受输入void类型变量的T函数,addTaskT类型的变量添加到处理队列。

调用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。

0 个答案:

没有答案