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
수정하려면 어떻게해야합니까?
당신은'std :: string'을 사용했습니다. 그것은 C++ 객체입니다. 당신은 'extern'C '그것을 할 수 없습니다. –
@RichardHodges 예. extern C 선언에서 C++ 객체를 사용할 수 있습니다. extern "C"는 연결에만 관련된 것입니다. '-stdlib = libstdC++ -static -lstdC++'를 사용하여이 문제를 해결할 수 있다면 정적으로 링크하는 것이 좋을 것입니다. 정적 링키지가 올바른 해결책인지는 모르겠다. –