2011-11-22 2 views
1

각 cu 파일에 정의 된 2 개의 cuda 커널 imageFlow() 및 cornerDetect()가 있습니다. 그것들은 공통 전역 함수 인 convolute1D()를 공유하는데, 이것은 자신의 cu 파일에도 있었어야합니다. 필자는 convolution.h의 헤더 파일에 convolute1D의 정의가 아닌 구현을해야했습니다. 이것은 두 커널에서 모두 사용하기 위해 cornerDetect.cu와 imageFlow.cu에 모두 포함됩니다. 이것은 모든 것이 "같은 컴파일 유닛"에 있어야하기 때문입니다.다중 정의를 피하면서 공통 기능을 가진 코드 구성

이제 문제는 컴파일 후, convolute1D가 실제로 imageFlow.obj와 cornerDetect.obj에 정의되어 있다는 것입니다. 왜냐하면 포함 된 헤더에 함수의 실제 구현이 있었기 때문입니다.

이것은 최종 링커 스테이지가 여러 번 정의 된 경위에 해당한다는 것을 의미합니다.

하나의 솔루션은 항상 네임 스페이스를 사용하는 것이지만 해결책은 무엇입니까? 문제를 패치하는 것 같아요. 최종 바이너리에서 convute1D를 여러 번 구현 한 경우가 있는데, imageFlow와 cornerDetection에 동일한 네임 스페이스를 사용해야하는 이유가 무엇입니까?

+0

convolute1D()를 인라인으로 선언하는 것이 가장 먼저해야 할 일은 구체적인 repro와 해상도가 없으면 "대답"으로 제공하는 것이 꺼려집니다. – ArchaeaSoftware

답변

2

extern 정의는 어떻게 사용합니까?

// convolution.h 
extern "C" void convolution1D() { 
    ... 
} 

// imageFlow.cu 
extern "C" void convolution1d(); 

// call the function when you need 
convolution1D(); 

동일한 방식으로 cornerDetect.cu 파일을 만듭니다.

+0

이들은 Cuda 커널이므로 C 연결이 유효하지 않습니다. 나는 그 점을 더 분명하게하기 위해 __global__ convolute1D (..)를 써야했다. 미안합니다. – JoeTaicoon

+0

@joetaicoon 지금 실종 됐습니다. .h에 커널이 있습니까? – pQB

관련 문제