Construyendo búferes de protocolo con una cadena de herramientas NDK independiente

Tengo problemas para construir Buffers de protocolo para Android usando una cadena de herramientas NDK autónoma creada con el script $ NDK / build / tools / make-standalone-toolchain.sh. El problema que tengo es el siguiente:

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' 

Lo que parece implicar que la biblioteca pthreads falta, sin embargo el sysroot fue creado por el script ndk por lo que debe contener todo, ¿verdad? He leído en alguna parte que es innecesario vincular explícitamente pthreads cuando se usa la cadena de herramientas independiente. El comando de configuración que usé fue:

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

Donde las variables de entorno están configuradas para apuntar en el sysroot creado por el script.

He visto este problema en un número de páginas en la red, pero nadie parece haber publicado una respuesta. ¿Alguien puede ayudar?

Conseguí construirlo usando el método ndk-build, usando la información que se encuentra aquí: Cómo construir un buffer de protocolo para Android NDK

Para configurar el script de configuración, ejecuté estos comandos:

 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" 

Este es el Application.mk que utilicé:

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

Y el Android.mk utilizado:

 # 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) 

Para incluir la biblioteca construida en mi otro proyecto NDK en el que estoy usando Buffers de protocolo, tuve que copiar la biblioteca en la carpeta jni del proyecto usando la biblioteca y modificar su Android.mk para añadir una referencia a ella:

 ... ... 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) 

Creo que eso es todo, espero que alguien lo encuentre útil.

  • Cómo forzar el modo de paisaje con NDK utilizando códigos C ++ puros
  • ¿Hay algún recurso bueno que discuta Android NDK API de una manera algo decente?
  • Reproductor de vídeo Android con NDK, OpenGL ES y FFmpeg
  • ¿Cómo apagar el teléfono Android mediante programación?
  • Recorte de video de Android a través de ffmpeg
  • Construyendo OpenSSL en Android NDK
  • Error en la creación del proyecto cocos2d-x android: atributo de objeto EABI desconocido 44
  • La biblioteca 'javacv-android-arm.jar' contiene bibliotecas nativas que no se ejecutan en el dispositivo
  • ¿Se bloquea la aplicación Android de repente mientras se ejecuta?
  • Problemas con Android NDK-7 y AWK
  • Qt5 para Android: incompatible ABI
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.