2013-10-02 3 views
0

3 개의 소스 파일이 있습니다. main.h에서함수 포인터에서 C++ 중복 기호

main(int dispersalfn) { 

if(dispersalfn == 0) { 
    kernel1 = flatdisp; 
    } else if(dispersalfn == 1) { 
    kernel1 = expdisp; 
    } 

[...more stuff...] 

} 

내가 kernel1에 대한 정의가 있습니다 : 주요 파일 포인터를 정의 할 if 문을 사용하는 기능이있다 disp.cpp에서

arma::vec (*kernel1)(arma::vec d, arma::vec m); 

을 내가 가진 flapdispexpdisp에 대한 정의 :

arma::vec flatdisp(arma::vec d, arma::vec m) { 
    return m; 
} 

arma::vec expdisp(arma::vec d, arma::vec m) { 
    return (square(m)/(2*M_PI)) % exp(-m % d); 
} 

disp.h에는 해당하는 de flatdispexpdisp에 대한 finitions :

arma::vec flatdisp(arma::vec d, arma::vec m); 
arma::vec expdisp(arma::vec d, arma::vec m); 

마지막으로 upfun.cppkernel1 전화 기능이 있습니다. upfun 의 함수는 main()에 의해 호출됩니다. 내가 컴파일 할 때

, 나는 오류 얻을 : 서로 가드를 포함해야

duplicate symbol _kernel in upfun.o and main.o for architecture x86_64 

내 모든 헤더 파일 소스를, 그래서 나는 그것을 생각하지 않습니다. 아이디어는 main()으로 전화 할 때 어떤 함수가 kernel1에 사용되는지 선택할 변수를 포함합니다. 내 기능을 다른 파일로 분리 할 때까지이 작업이 수행되었습니다. 이 오류의 원인은 무엇입니까?

+0

#ifndef HEADER_H #define HEADER_H를 사용하면 어떻게 작동합니까? – Leosar

답변

3

나는 당신이 말하는 것을 의미한다고 가정합니다

duplicate symbol _kernel1 in upfun.o and main.o for architecture x86_64 

링커는 하나 개 이상의 장소에서 기호 (일명, 변수) "kernel1"를 정의했다고 불평한다.

문제는 main.h 헤더 파일에 "kernel1"변수를 정의했기 때문입니다. 이 헤더 파일은 둘 이상의 .cpp 파일에 포함됩니다. 따라서 하나 이상의 컴파일 단위에서 "kernel1"을 효과적으로 정의했습니다.

해결책은 간단합니다. 대신을 MAIN.CPP하는 "kernel1"의 정의를 이동 : 그것은 "kernel1는"뿐만 아니라 다른 파일에서 사용되는 기호를 지적했다

:

arma::vec (*kernel1)(arma::vec d, arma::vec m); 

업데이트 코멘트를 해결하기 위해 추가했다. 경우 ,

  1. "kernel1"의 정의가 여전히 전술 한 바와 같이 MAIN.CPP 일어날 필요가있다.

  2. 는 main.h 헤더 파일에 kernel1의 '통근'선언을 추가합니다 :

    extern arma::vec (*kernel1)(arma::vec d, arma::vec m); 
    

이 문제를 해결해야한다.

+0

이렇게하면 'upfun.cpp : 18 : error :'kernel1 '이 선언되지 않았습니다. 이 범위에서'. 'upfun'의 함수는'kernel1'을 필요로하기 때문에 ('main'에 정의되어 있습니다), 헤더에 있어야합니다. 위의 @Leonardo에 따라, 모든 헤더 파일에'#ifndef HEADER_H #define HEADER_H' 가드가 포함되어 있습니다. –

+0

@Noam Ross : 귀하의 의견을 반영하기 위해 답변을 업데이트했습니다. – joyjit

+0

부분적으로이 문제를 해결했습니다. 이 오류는 제거되었지만 나중에로드 할 때 'Symbol not found : kernel1' 오류가 발생합니다. 그것은 또한'main.cpp'에서'kernel1' 선언을위한 디폴트 값을 가져야 만했습니다. –