我有两个cuda内核imageFlow()和cornerDetect(),在他们各自的cu文件中定义。它们共享一个共同的全局函数convolute1D(),它本身也应该在它自己的cu文件中。我不得不在头文件convolution.h中放置它,实现 - 不仅仅是convolute1D的定义。然后将它包含在cornerDetect.cu和imageFlow.cu中,以便从两个内核中使用它。这是因为一切都必须在“相同的编译单元”中。
现在的问题是,在编译之后,convolute1D实际上是在imageFlow.obj和cornerDetect.obj中定义的,因为包含的头部具有该函数的实际实现。
这意味着最终的链接器阶段会对convolute1D定义多次。
一种解决方案是始终使用命名空间,但这就是解决方案吗?这似乎更像是修补问题。我仍然在最后的二进制文件中多次执行convolute1D,如果我有理由对我的imageFlow和cornerDetection使用相同的命名空间怎么办?
答案 0 :(得分:2)
使用extern定义怎么样?
// convolution.h
extern "C" void convolution1D() {
...
}
// imageFlow.cu
extern "C" void convolution1d();
// call the function when you need
convolution1D();
cornerDetect.cu文件的方法相同。