2016-11-01 12 views
1

다양한 IDL 파일에서 가져온 DDS 항목의 정의가 들어있는 정적 라이브러리를 빌드하려고합니다. 내 미들웨어로 OpenDDS를 사용하고 있습니다. 내가 믿는정적 라이브러리에서 템플릿 인스턴스화 방지

Error LNK2005 "public: void __cdecl TAO::unbounded_value_sequence<int>::length(unsigned int)" ([email protected][email protected]@[email protected]@[email protected]) already defined in TAO.lib(TAO.dll)  

: 나는 sequence<long>을 포함하는 IDL 파일을 만들 때

은 내가 링커 오류 심볼의 여러 정의를 포함 얻을 내 정적 라이브러리로 컴파일 한 후 내 응용 프로그램에 정적 라이브러리를 링크 이것은 내 정적 라이브러리에 unbounded_value_sequence의 템플릿 인스턴스화가 포함되어 있고 내 응용 프로그램에도 인스턴스화가 포함되어 있기 때문입니다. OpenDDS에서 사용하는 ACE TAO에서 오는 것 같습니다.

정적 라이브러리에서 템플릿을 인스턴스화하는 것을 피할 수있는 방법을 찾고 있습니다. 따라서이 템플릿을 함께 연결했을 때 응용 프로그램 내에서 정의를 사용할 수 있습니다. 나는 다음과 같은 추가 시도 :

extern template class TAO::unbounded_value_sequence<int>; 

이 다음과 같은 오류가 발생 : 그 인스턴스를 찾기 위해 노력했지만이 아니 내 코드에서 한

Error C2961 'TAO::unbounded_value_sequence<CORBA::Long>': inconsistent explicit instantiations, a previous explicit instantiation did not specify '__declspec(dllimport)' 

. 그것은 ACE 자체 내에있을 수 있습니다.

한 프로젝트에서 모든 것을 빌드하면 문제가 발생하지 않지만 이상적인 솔루션은 아닙니다.

답변

1

extern 템플릿을 사용하기 위해해야 ​​할 일은 조금 다릅니다. 실제로 extern 템플릿을 선언하면 인스턴스가 생성되지 않습니다. 하지만 인스턴스가 어딘가에이 필요합니다. 보통 어딘가에 컴파일하려고하는 템플릿의 이름을 가진 cpp에 있습니다.

unbounded_value_sequence.h :

// template struct here 

extern template class TAO::unbounded_value_sequence<int>; 
extern template class TAO::unbounded_value_sequence<long>; 
// and every other instantiation you want to be in your static library 

unbounded_value_sequence.cpp : 템플릿을 만들 것입니다

#include "unbounded_value_sequence.h" 

// Here you compile them one time. 
template class TAO::unbounded_value_sequence<int>; 
template class TAO::unbounded_value_sequence<long>; 
// and every other instantiation you want to be in your static library 

이 라이브러리 내부에, 한 번만 인스턴스화합니다. 컴파일러는 템플릿 인스턴스화를 포함하는 unbounded_value_sequence 개체 파일을 생성합니다. 그들은 거기에만 존재할 것입니다.

라이브러리 사용자가 자신의 템플릿 클래스를 사용하도록하려면 템플릿 구현을 헤더에 표시해야 함을 잊지 마십시오.