2012-04-28 72 views
3

我無法使用帶有$ NDK /編譯/工具/ make-standalone-toolchain.sh腳本創建一個獨立的NDK工具鏈建設協議緩衝區爲Android。我遇到的問題是這樣的:建設協議緩衝器,具有獨立NDK工具鏈

libtool: link: g++ -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -O2 -g -DNDEBUG -o protoc main.o ./.libs/libprotobuf.a ./.libs/libprotoc.a /home/sizeak/AudioFingerprinting/ProtoBuf/jni/src/.libs/libprotobuf.a -lz -lc 
./.libs/libprotoc.a(plugin.pb.o): In function `GoogleOnceInit': 
/home/sizeak/AudioFingerprinting/ProtoBuf/jni/src/./google/protobuf/stubs/once.h:115: undefined reference to `pthread_once' 

這似乎暗示並行線程庫丟失,但是SYSROOT由NDK腳本創建這樣應該包含一切,對不對?我在某處讀到,在使用獨立工具鏈時,沒有必要明確鏈接pthread。我使用的配置命令是:

./configure --host=arm-eabi --with-sysroot=$SYSROOT CC=$CC --enable-cross-compile --with-protoc=protoc LIBS="-lc" 

其中環境變量設置爲指向由腳本創建的sysroot。

我在網上看到過許多網頁上的這個問題,但似乎沒有人發佈過答案。誰能幫忙?

+0

是ProtoBuf你的Android應用程序,你想創建一個共享庫,並在這個Android App.Have中使用它,你提到了android.mk文件中的pthread選項? – Raulp 2012-04-28 19:21:15

+0

ProtoBuf是一個試圖用ndk-build構建庫的項目,在我發現獨立工具鏈選項之前。 – 2012-04-28 20:09:16

回答

6

我設法使用NDK-build方法來構建它,使用這裏找到的信息:How to build protocol buffer by Android NDK

要設置的配置腳本,我跑以下命令:

export CFLAGS="-march=armv7-a -mfloat-abi=softfp -DGOOGLE_PROTOBUF_NO_RTTI" 
export CC=arm-linux-androideabi-gcc 
export SYSROOT=$NDK/platforms/android-9/arch-arm 
./configure --host=arm-eabi --with-sysroot=$SYSROOT CC=$CC --enable-cross-compile --with-protoc=protoc LIBS="-lc" 

這是Application.mk我用:

APP_STL := gnustl_static 
APP_ABI := armeabi-v7a armeabi 
APP_PROJECT_PATH := ./ 
APP_BUILD_SCRIPT := ./Android.mk 

而且Android.mk使用:

# Copyright (C) 2009 The Android Open Source Project 
# 
# Licensed under the Apache License, Version 2.0 (the "License"); 
# you may not use this file except in compliance with the License. 
# You may obtain a copy of the License at 
# 
#  http://www.apache.org/licenses/LICENSE-2.0 
# 
# Unless required by applicable law or agreed to in writing, software 
# distributed under the License is distributed on an "AS IS" BASIS, 
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
# See the License for the specific language governing permissions and 
# limitations under the License. 
# 
# 

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
CC_LITE_SRC_FILES := \ 
src/google/protobuf/stubs/common.cc        \ 
src/google/protobuf/stubs/once.cc        \ 
src/google/protobuf/extension_set.cc        \ 
src/google/protobuf/generated_message_util.cc     \ 
src/google/protobuf/message_lite.cc        \ 
src/google/protobuf/repeated_field.cc       \ 
src/google/protobuf/wire_format_lite.cc       \ 
src/google/protobuf/io/coded_stream.cc       \ 
src/google/protobuf/io/zero_copy_stream.cc      \ 
src/google/protobuf/io/zero_copy_stream_impl_lite.cc 


COMPILER_SRC_FILES := \ 
src/google/protobuf/descriptor.cc \ 
src/google/protobuf/descriptor.pb.cc \ 
src/google/protobuf/descriptor_database.cc \ 
src/google/protobuf/dynamic_message.cc \ 
src/google/protobuf/extension_set.cc \ 
src/google/protobuf/extension_set_heavy.cc \ 
src/google/protobuf/generated_message_reflection.cc \ 
src/google/protobuf/generated_message_util.cc \ 
src/google/protobuf/message.cc \ 
src/google/protobuf/message_lite.cc \ 
src/google/protobuf/reflection_ops.cc \ 
src/google/protobuf/repeated_field.cc \ 
src/google/protobuf/service.cc \ 
src/google/protobuf/text_format.cc \ 
src/google/protobuf/unknown_field_set.cc \ 
src/google/protobuf/wire_format.cc \ 
src/google/protobuf/wire_format_lite.cc \ 
src/google/protobuf/compiler/code_generator.cc \ 
src/google/protobuf/compiler/command_line_interface.cc \ 
src/google/protobuf/compiler/importer.cc \ 
src/google/protobuf/compiler/main.cc \ 
src/google/protobuf/compiler/parser.cc \ 
src/google/protobuf/compiler/plugin.cc \ 
src/google/protobuf/compiler/plugin.pb.cc \ 
src/google/protobuf/compiler/subprocess.cc \ 
src/google/protobuf/compiler/zip_writer.cc \ 
src/google/protobuf/compiler/cpp/cpp_enum.cc \ 
src/google/protobuf/compiler/cpp/cpp_enum_field.cc \ 
src/google/protobuf/compiler/cpp/cpp_extension.cc \ 
src/google/protobuf/compiler/cpp/cpp_field.cc \ 
src/google/protobuf/compiler/cpp/cpp_file.cc \ 
src/google/protobuf/compiler/cpp/cpp_generator.cc \ 
src/google/protobuf/compiler/cpp/cpp_helpers.cc \ 
src/google/protobuf/compiler/cpp/cpp_message.cc \ 
src/google/protobuf/compiler/cpp/cpp_message_field.cc \ 
src/google/protobuf/compiler/cpp/cpp_primitive_field.cc \ 
src/google/protobuf/compiler/cpp/cpp_service.cc \ 
src/google/protobuf/compiler/cpp/cpp_string_field.cc \ 
src/google/protobuf/compiler/java/java_enum.cc \ 
src/google/protobuf/compiler/java/java_enum_field.cc \ 
src/google/protobuf/compiler/java/java_extension.cc \ 
src/google/protobuf/compiler/java/java_field.cc \ 
src/google/protobuf/compiler/java/java_file.cc \ 
src/google/protobuf/compiler/java/java_generator.cc \ 
src/google/protobuf/compiler/java/java_helpers.cc \ 
src/google/protobuf/compiler/java/java_message.cc \ 
src/google/protobuf/compiler/java/java_message_field.cc \ 
src/google/protobuf/compiler/java/java_primitive_field.cc \ 
src/google/protobuf/compiler/java/java_service.cc \ 
src/google/protobuf/compiler/javamicro/javamicro_enum.cc \ 
src/google/protobuf/compiler/javamicro/javamicro_enum_field.cc \ 
src/google/protobuf/compiler/javamicro/javamicro_field.cc \ 
src/google/protobuf/compiler/javamicro/javamicro_file.cc \ 
src/google/protobuf/compiler/javamicro/javamicro_generator.cc \ 
src/google/protobuf/compiler/javamicro/javamicro_helpers.cc \ 
src/google/protobuf/compiler/javamicro/javamicro_message.cc \ 
src/google/protobuf/compiler/javamicro/javamicro_message_field.cc \ 
src/google/protobuf/compiler/javamicro/javamicro_primitive_field.cc \ 
src/google/protobuf/compiler/python/python_generator.cc \ 
src/google/protobuf/io/coded_stream.cc \ 
src/google/protobuf/io/gzip_stream.cc \ 
src/google/protobuf/io/printer.cc \ 
src/google/protobuf/io/tokenizer.cc \ 
src/google/protobuf/io/zero_copy_stream.cc \ 
src/google/protobuf/io/zero_copy_stream_impl.cc \ 
src/google/protobuf/io/zero_copy_stream_impl_lite.cc \ 
src/google/protobuf/stubs/common.cc \ 
src/google/protobuf/stubs/once.cc \ 
src/google/protobuf/stubs/structurally_valid.cc \ 
src/google/protobuf/stubs/strutil.cc \ 
src/google/protobuf/stubs/substitute.cc 

# C++ full library 
# ======================================================= 
#include $(CLEAR_VARS) 

LOCAL_MODULE := libprotobuf-lite 
LOCAL_MODULE_TAGS := optional 

LOCAL_CPP_EXTENSION := .cc 

LOCAL_SRC_FILES := \ 
$(CC_LITE_SRC_FILES)            #\ 
#src/google/protobuf/stubs/strutil.cc        \ 
#src/google/protobuf/stubs/substitute.cc       \ 
#src/google/protobuf/stubs/structurally_valid.cc     \ 
#src/google/protobuf/descriptor.cc        \ 
#src/google/protobuf/descriptor.pb.cc        \ 
#src/google/protobuf/descriptor_database.cc      \ 
#src/google/protobuf/dynamic_message.cc       \ 
#src/google/protobuf/extension_set_heavy.cc      \ 
#src/google/protobuf/generated_message_reflection.cc    \ 
#src/google/protobuf/message.cc         \ 
#src/google/protobuf/reflection_ops.cc       \ 
#src/google/protobuf/service.cc         \ 
#src/google/protobuf/text_format.cc        \ 
#src/google/protobuf/unknown_field_set.cc       \ 
#src/google/protobuf/wire_format.cc        \ 
#src/google/protobuf/io/gzip_stream.cc       \ 
#src/google/protobuf/io/printer.cc        \ 
#src/google/protobuf/io/tokenizer.cc        \ 
#src/google/protobuf/io/zero_copy_stream_impl.cc     \ 
#src/google/protobuf/compiler/importer.cc       \ 
#src/google/protobuf/compiler/parser.cc 

LOCAL_C_INCLUDES := \ 
$(LOCAL_PATH)/src 

LOCAL_C_INCLUDES := \ 
$(LOCAL_PATH)/android \ 
bionic \ 
$(LOCAL_PATH)/src \ 
$(JNI_H_INCLUDE) 

LOCAL_SHARED_LIBRARIES := \ 
libz libcutils libutils 
LOCAL_LDLIBS := -lz 
# stlport conflicts with the host stl library 
#ifneq ($(TARGET_SIMULATOR),true) 
#LOCAL_C_INCLUDES += external/stlport/stlport 
#LOCAL_SHARED_LIBRARIES += libstlport 
#endif 

# Define the header files to be copied 
#LOCAL_COPY_HEADERS := \ 
# src/google/protobuf/stubs/once.h \ 
# src/google/protobuf/stubs/common.h \ 
# src/google/protobuf/io/coded_stream.h \ 
# src/google/protobuf/generated_message_util.h \ 
# src/google/protobuf/repeated_field.h \ 
# src/google/protobuf/extension_set.h \ 
# src/google/protobuf/wire_format_lite_inl.h 
# 
#LOCAL_COPY_HEADERS_TO := $(LOCAL_MODULE) 

LOCAL_CFLAGS := -DGOOGLE_PROTOBUF_NO_RTTI 

include $(BUILD_SHARED_LIBRARY) 

要在我的其他項目NDK內置庫,我使用協議緩衝區中,我使用的庫到庫複製到項目的JNI文件夾,並修改其Android.mk添加到參考它:

... 
... 
LOCAL_LDLIBS := -llog -lOpenSLES -lGLESv2 jni/libprotobuf-lite.so 
include $(BUILD_SHARED_LIBRARY) 

include $(CLEAR_VARS) 

LOCAL_MODULE := protobuf-lite 
LOCAL_SRC_FILES := libprotobuf-lite.so 

include $(PREBUILT_SHARED_LIBRARY) 

我認爲就是這樣,希望有人認爲它有用。

+0

感謝分享。這個** ./ Configuration **文件包含什麼,你提到安裝配置腳本。 – CoDe 2015-09-18 10:24:02

+0

此外,雖然下面提到的過程我得到**沒有規則,使目標'jni/src/google/protobuf/stubs/common.cc ..'**錯誤。任何建議,如果我錯過了點! – CoDe 2015-09-18 10:46:32

+0

確定了...忘了添加lib源文件...現在開始構建,但很快回復失敗,並顯示消息** jni /./ src/google/protobuf/stubs/common.cc:51:2:error: #error「沒有合適的線程庫可用**任何建議! – CoDe 2015-09-18 11:33:28