3

私は共有ライブラリを構築しようとしています。最終的には、be32tohle32tohへの参照を使用するコードをクロスコンパイルします。このコードをビルドして実行可能ファイルを作成しても、エラーは発生しません。

    include $(CLEAR_VARS) 
    LOCAL_SRC_FILES:= ubertooth.c ubertooth_helper.c 
    LOCAL_MODULE := ubertooth 
    LOCAL_C_INCLUDES += jni/libusb jni/libbtbb 
    LOCAL_SHARED_LIBRARIES := libc libusb libbtbb 
    LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog  
    include $(BUILD_EXECUTABLE) 

ここでは正常にコンパイルされます。

    Compile thumb  : ubertooth <= ubertooth.c
    Compile thumb  : ubertooth <= ubertooth_helper.c
    Executable     : ubertooth
    Install        : ubertooth => libs/armeabi/ubertooth

ただし、Android.mkの1行を変更するだけで共有ライブラリとしてビルドしようとすると、次のようになります。

    include $(CLEAR_VARS) 
    ...
    include $(BUILD_SHARED_LIBRARY) 

次のエラーが発生します。

    Compile thumb  : ubertooth <= ubertooth.c
    Compile thumb  : ubertooth <= ubertooth_helper.c
    SharedLibrary  : libubertooth.so
    ./obj/local/armeabi/objs-debug/ubertooth/ubertooth.o: In function `stream_rx_file':
    ubertooth.c:224: undefined reference to `be32toh'
    ./obj/local/armeabi/objs-debug/ubertooth/ubertooth.o: In function `cb_lap':
    ubertooth.c:281: undefined reference to `le32toh'
    ./obj/local/armeabi/objs-debug/ubertooth/ubertooth.o: In function `cb_hop':
    ubertooth.c:417: undefined reference to `le32toh'
    ./obj/local/armeabi/objs-debug/ubertooth/ubertooth.o: In function `cb_btle':
    ubertooth.c:506: undefined reference to `le32toh'
    collect2: ld returned 1 exit status

共有ライブラリをビルドするときにこのリンクエラーが発生する理由はわかりませんが、実行可能ファイルをビルドするときはわかりません。また、共有ライブラリを構築したい場合、不足しているものに適切にリンクするにはどうすればよいですか?

これがubertooth.cです

4

1 に答える 1

3

sys/endian.h にある NDK では、これらのマクロの名前が異なっているようです。

__uint64_t  htobe64(__uint64_t);
__uint32_t  htobe32(__uint32_t);
__uint16_t  htobe16(__uint16_t);
__uint64_t  betoh64(__uint64_t);
__uint32_t  betoh32(__uint32_t);
__uint16_t  betoh16(__uint16_t);

__uint64_t  htole64(__uint64_t);
__uint32_t  htole32(__uint32_t);
__uint16_t  htole16(__uint16_t);
__uint64_t  letoh64(__uint64_t);
__uint32_t  letoh32(__uint32_t);
__uint16_t  letoh16(__uint16_t);

それで、letoh32betoh32を使用しました

于 2012-07-28T16:37:26.150 に答える