2014-09-09 2 views
0

내가 사용하여 내 코드를 컴파일.정의되지 않은 기호는

U Array<void const*>::size(int, bool, bool, bool) 

그러나이 '크기'함수 내의 헤더 파일에 정의되고 구현되는 'I는 나노 미터를 사용하여 코드를 분해 해제

loading error /home/rw/rw_lib/Exotics.so: undefined symbol: _ZN5ArrayIPKvE4sizeEibbb 

내게 오류를 제공하고 라인이 있었다/rw/include/'와 같이 :

template <class T> 
int 
Array<T>::size(int n, bool reduceMem, bool copyData, bool delData) 
{ 
    return _size(n, reduceMem, copyData, delData); 
} 

'_size '도 바로 아래에 정의되어 있습니다.

이 코드를 잘못 컴파일하고 있습니까? 이것이 붉은 청어 일 수있는 다른 가능한 문제가 있습니까?

답변

2

-fno-implicit-templates은 "사용하는 템플릿을 인스턴스화하지 말고 명시 적 인스턴스화를 제공하여 수동으로 수행합니다."라는 의미입니다.

그래서 컴파일러에게 거짓말을했습니다. 필요한 심볼을 제공하기 위해 Array<T>::size 함수 템플릿을 인스턴스화하는 것을 괴롭히지 않도록 요청 했으므로 요청한대로 처리했지만 거래를 끝내지는 않았습니다.

가장 좋은 해결책은 해당 옵션 사용을 중단하고 컴파일러에서 자동으로 올바른 작업을 수행하도록하는 것입니다. Array<void const*>::size(int, bool, bool, bool)을 사용하면 헤더 파일의 일반 정의를 인스턴스화하고 누락 된 심볼을 제공합니다.

GCC manual 자세한 내용은 해당 페이지의 내용이 오래되어 있고 -frepo이라는 비트가 무시되어야한다고 말하는 내용을 참조하십시오. 가장 좋은 옵션은 세 번째 것입니다.

정말로이 옵션을 사용하려면 사용하는 모든 템플릿 (GCC 문서의 두 번째 옵션)에 대한 명시적인 인스턴스화를 제공해야합니다. .C 파일 (하지 헤더)에서과 같이 Array<void const*>의 명시 적 인스턴스를 정의

template class Array<void const*>; 

또는 단일 기능 :

template int Array<void const*>::size(int, bool, bool, bool); 
+0

감사합니다. – jpints14

-1

을 당신이 헤더 파일 (-I)를 포함하여 참조하십시오. 그게 맥인가? 나는 길을 알지 못한다. 은 어쩌면이 당신을 도울 수 있습니다 : 나는 다른 곳에서 사용되는

g++ -std=c++11 your_file.cpp -o your_program -I(as necessary) 

을 본 적이

clang++ -stdlib=libc++ leads to undefined reference

.

관련 문제