2016-09-14 6 views
-1

Clang ++을 사용하여 공유 객체를 만듭니다. 주요 기능은 'extern'C ''블록에 있습니다. 건물은 괜찮습니다. JNA를 사용하여 이러한 함수를 호출 할 수 있습니다. 그때Clang ++는 -lstdC++를 사용할 때 extern "C"의 이름을 사용합니다.

를 얻을 내가
nm target/classes/linux-x86-64/libCloudCryptoLibrary.so |grep init 

을 실행

undefined symbol: _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm 

: - 나는 (일부 C++ 11 기능을 사용하기위한) 플래그 "-lstdC++"를 추가

나는 런타임 오류가 발생했습니다

    U _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm 
       U _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc 
0000000000004860 T _init 
0000000000024360 T init 

해당 플래그를 제거하고 다시 nm을 실행하면 다음과 같이 나타납니다.

    U [email protected]@GLIBCXX_3.4.11 
000000000026b920 b _ZStL8__ioinit 
000000000026b9e0 b _ZStL8__ioinit 
0000000000004508 T _init 
0000000000021000 T init 

수정하려면 어떻게해야합니까?

+5

당신은'std :: string'을 사용했습니다. 그것은 C++ 객체입니다. 당신은 'extern'C '그것을 할 수 없습니다. –

+1

@RichardHodges 예. extern C 선언에서 C++ 객체를 사용할 수 있습니다. extern "C"는 연결에만 관련된 것입니다. '-stdlib = libstdC++ -static -lstdC++'를 사용하여이 문제를 해결할 수 있다면 정적으로 링크하는 것이 좋을 것입니다. 정적 링키지가 올바른 해결책인지는 모르겠다. –

답변

0

솔루션을 찾았습니다. extern "C"블록에 "init"이라는 함수가 있습니다 ("0000000000021000 T init"줄을 볼 수 있습니다). "initMyClass"로 이름을 바꾸면 문제가 사라집니다.

+0

오버로드를 구별하기 위해 이름 맹 글링이 필요하기 때문에'extern "C"'는 오버로드 된 함수에서 사용할 수 없습니다. 그래서이 대답은 의미가 있습니다 : 그것은'init'의 오버로드를 피합니다. – MSalters