2016-11-17 10 views
0

이 메서드 서명이있는 곳을 찾을 수 없어서 내 공유 라이브러리를 OpenDDS (v3.9) 정적 라이브러리에 연결하는 데 문제가 있습니다.OpenDDS의 라이브러리에는 "OpenDDS :: DCPS :: operator <<"가 포함되어 있습니까?

다음은 오류입니다.

[exec] libs/mylib/ABTypeSupportImpl.cpp:74: error: undefined reference to 'OpenDDS::DCPS::operator<<(OpenDDS::DCPS::Serializer&, short)' 
[exec] collect2: error: ld returned 1 exit status 
[exec] make: *** [/tmp/mybuild/lib_ab/obj/local/armeabi-v7a/lib_ab.so] Error 1 

IDType을 컴파일하면 ABTypeSupportImpl.cpp가 자동으로 생성됩니다. 같은 오류가 더 많이 발생합니다. 네임 스페이스 (OpenDDS :: DCPS) 때문에이 라이브러리 libOpenDDS_Dcps.a에서 찾을 수 있다고 생각하지만,이 lib에 nm을 사용하고 "operator"또는 "< <"에 대해 grep'ing하면 결과가 산출되지 않습니다. 맹 글링 (mangling)이라는 이름이 과부하가 걸린 운영자에게 약간 이상한가? $ DDS_ROOT/lib 내의 모든 라이브러리 파일에서이 파일을 실행했지만 아무것도 발견되지 않았습니다.

IDL을 다시 컴파일하고 구조체의 멤버 필드를 short 또는 long과 같은 데이터 유형으로 제거하면 오류가없고 모든 것이 잘 연결됩니다.

누구나이 메소드 서명이있는 라이브러리를 아십니까?

답변

1

이 연산자는 'dds/DCPS/Serializer.h'에 선언되어 있지만 Serializer.inl에서는 인라인으로 구현됩니다. 아마도 인라인을 사용하여 OpenDDS를 컴파일했을 것입니다 (기본값).하지만 응용 프로그램을 컴파일 할 때 인라인을 사용하지 않고 컴파일하면됩니다.

+0

내 프로그램을 인라인으로 말하는 것은 컴파일러가 선택할 수도 있고하지 않을 수도있는 내부 최적화라고 생각합니다. 적어도 그것은 나의 이해입니다. 나는 컴파일에서 특별히 무능력하게하지 않는다. 나는 다양한 깃발을 시험해 왔습니다. – Ender

+0

또한, 나는 GCC optimize-options를 01 이상으로 시도해 봤는데, 인라인 함수를 위해 꽤 많이하는 것 같다. – Ender

+0

인라인 메소드를 사용하거나 사용하지 않도록 OpenDDS (및 ACE)에서 사용되는 정의가 있으며, 인라이닝을 사용할지 여부를 코드 레벨에서 지정하는 기능입니다. 컴파일러에 __ACE_INLINE__ 또는 ACE_NO_INLINE을 추가하여 코드를 컴파일 할 때 OpenDDS 컴파일시 사용 된 OpenDDS 컴파일을 확인하십시오. –