2016-08-30 105 views
0

我想在使用Android.mk的靜態庫中鏈接,但出現以下錯誤。如何在Android.mk中包含靜態第三方庫?

/home/pep/tools/crystax-ndk-10.3.2/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -Wl,--gc-sections -Wl,-z,nocopyreloc --sysroot=/home/pep/tools/crystax-ndk-10.3.2/platforms/android-21/arch-arm -Wl,-rpath-link=/home/pep/tools/crystax-ndk-10.3.2/platforms/android-21/arch-arm/usr/lib -Wl,-rpath-link=/home/pep/workspace/elm/src/agents/viga/obj/local/armeabi-v7a /home/pep/workspace/elm/src/agents/viga/obj/local/armeabi-v7a/objs/van/main.o -lgcc /home/pep/workspace/elm/src/agents/viga/obj/local/armeabi-v7a/libecom.so /home/pep/workspace/elm/src/agents/viga/obj/local/armeabi-v7a/libgnustl_shared.so -no-canonical-prefixes -march=armv7-a -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -fPIE -pie -mthumb -L/home/pep/tools/ros-android-ndk/roscpp_android/output/roscpp_android_ndk/lib /home/pep/tools/crystax-ndk-10.3.2/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libsupc++.a -L/home/pep/tools/crystax-ndk-10.3.2/sources/crystax/empty /home/pep/tools/crystax-ndk-10.3.2/sources/crystax/libs/armeabi-v7a/thumb/libcrystax.so -lc -o /home/pep/workspace/elm/src/agents/viga/obj/local/armeabi-v7a/van 
/home/pep/workspace/elm/src/agents/viga/jni/main.cpp:34: error: undefined reference to 'ros::init(int&, char**, std::string const&, unsigned int)' 
collect2: error: ld returned 1 exit status 

這樣看來,該庫是不被鏈接中,沒有-l,但據我所知,這是被包括正確使用LOCAL_STATIC_LIBRARIES。我試過將它列爲libroscpp以及-lroscpp。這是Android.mk。

LOCAL_PATH := $(call my-dir) 

MY_ELM_HOME := /home/pep/workspace/elm/src 
MY_ELM_INCL := /home/pep/workspace/elm/src/includes 
MY_ROS_HOME := /home/pep/tools/ros-android-ndk/roscpp_android/output/roscpp_android_ndk 

MY_COMMONS_INCL := $(MY_ELM_HOME)/includes/commons 
MY_COMMONS_LIBS := $(MY_ELM_HOME)/libs/commons/libs/armeabi-v7a 
MY_ROS_INCL := $(MY_ROS_HOME)/include 
MY_ROS_LIBS := $(MY_ROS_HOME)/lib 

include $(CLEAR_VARS) 
LOCAL_MODULE := mycom 
LOCAL_SRC_FILES := $(MY_COMMONS_LIBS)/libecom.so 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := van 
LOCAL_C_INCLUDES := $(MY_ELM_INCL) 
LOCAL_C_INCLUDES += $(MY_ROS_INCL) 
LOCAL_SRC_FILES := main.cpp 
LOCAL_CPPFLAGS := -std=gnu++14 
LOCAL_CPP_FEATURES := rtti exceptions 
LOCAL_LDLIBS := -L$(MY_ROS_LIBS) 
LOCAL_SHARED_LIBRARIES := mycom 
LOCAL_STATIC_LIBRARIES := libroscpp 
LOCAL_STATIC_LIBRARIES += libroscpp_serialization 
LOCAL_STATIC_LIBRARIES += librosconsole 
include $(BUILD_EXECUTABLE) 

$(call import-module,boost/1.59.0) 

我使用-lroscpp與LOCAL_LDLIBS試過,但我得到一個錯誤,將訊息傳送說使用LOCAL_STATIC_LIBRARIES。我確定這個路徑對於靜態庫是正確的。

這裏是libroscpp.a中的符號。

$ nm -Ca ./libroscpp.a | grep "ros::init" 
... <snip> 
00000001 T ros::init(int&, char**, std::string const&, unsigned int) 
... <snip> 

我也嘗試重新排序庫,但無濟於事。

想法?

+1

爲包括靜態庫(* .a)有是一個PREBUILD_STATIC_LIBRARY,它與共享的一樣使用,那就是你需要使用像libecom.so –

+0

這樣的模塊。如果你想做出答案,我會標記它。 – Ender

回答

1

爲包括靜態庫(* .a)有是用於像共享一個PREBUILD_STATIC_LIBRARY,那就是你需要做模塊像libecom.so

相關問題