Android - Qt - Protobuf: компиляция protobuf с помощью предварительно собранных наборов инструментов ndk - PullRequest
1 голос
/ 28 марта 2020

В настоящее время я портирую приложение, написанное на Qt5, на Android.

Я установил Qt5 через его официальный установщик вместе с AndroidSdk через Android Studio.

I может скомпилировать, развернуть и выполнить приложение Qt5 / Qml для цели Android.

Однако приложение, которое я портирую, использует Protobuf, поэтому я хочу сделать кросс-компиляцию этой библиотеки с помощью компилятора, который Qt использует для упакуйте его вместе с моим приложением.

Я успешно построил protobuf с автономным набором инструментов после этого ресурса: https://developers.google.com/cardboard/develop/c/protobuf

Но при использовании набора инструментов Qt5 я не являюсь возможность сборки библиотеки protobuf. * ​​1014 *

Пример рабочих команд компиляции моего приложения:

/home/cfv/Android/Sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ -c -D__ANDROID_API__=21 -target armv7-none-linux-androideabi -gcc-toolchain /home/cfv/Android/Sdk/ndk/20.0.5594570/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 -fno-limit-debug-info -DANDROID_HAS_WSTRING --sysroot=/home/cfv/Android/Sdk/ndk/20.0.5594570/sysroot -isystem /home/cfv/Android/Sdk/ndk/20.0.5594570/sysroot/usr/include/arm-linux-androideabi -isystem /home/cfv/Android/Sdk/ndk/20.0.5594570/sources/cxx-stl/llvm-libc++/include -isystem /home/cfv/Android/Sdk/ndk/20.0.5594570/sources/android/support/include -isystem /home/cfv/Android/Sdk/ndk/20.0.5594570/sources/cxx-stl/llvm-libc++abi/include -fstack-protector-strong -DANDROID -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -fno-builtin-memmove -fPIC -Wl,Bsymbolic -g -g -marm -O0 -std=gnu++1z -Wall -W -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CONCURRENT_LIB -DQT_CORE_LIB -I../NaioCompanion -I. -I/opt/Qt/5.13.0/android_armv7/include -I/opt/Qt/5.13.0/android_armv7/include/QtQuick -I/opt/Qt/5.13.0/android_armv7/include/QtGui -I/opt/Qt/5.13.0/android_armv7/include/QtQml -I/opt/Qt/5.13.0/android_armv7/include/QtNetwork -I/opt/Qt/5.13.0/android_armv7/include/QtConcurrent -I/opt/Qt/5.13.0/android_armv7/include/QtCore -I. -I/opt/Qt/5.13.0/android_armv7/mkspecs/android-clang -o xxx.o ../NaioCompanion/Publisher.cpp

Скрипт сборки, который я использую для Protobuf, настроен из ресурса, упомянутого выше:

export build_dir=`pwd`/../protobuf-for-android-with-qt5-toolchain/
export NDK=/home/cfv/Android/Sdk/ndk/20.0.5594570/
export sysroot=/home/cfv/Android/Sdk/ndk/20.0.5594570/platforms/android-21/arch-arm
export PATH=/home/cfv/Android/Sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/linux-x86_64/bin/:$PATH
export CC="/home/cfv/Android/Sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --sysroot=$sysroot"
export CXX="/home/cfv/Android/Sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --sysroot=$sysroot"

./configure \
--host=arm-linux-androideabi \
--with-protoc=protoc \
--with-sysroot="$sysroot" \
--disable-shared \
--prefix="$build_dir/armeabi-v7a" \
--enable-cross-compile \
CFLAGS="-D__ANDROID_API__=21 -target armv7-none-linux-androideabi -march=armv7-a" \
CXXFLAGS="-frtti -fexceptions -target armv7-none-linux-androideabi -D__ANDROID_API__=21" \
LIBS="-llog -lz"

make -j2
make install

вывод:

checking whether to enable maintainer-specific portions of Makefiles... yes
checking build system type... x86_64-pc-linux-gnu
checking host system type... arm-unknown-linux-androideabi
checking target system type... arm-unknown-linux-androideabi
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-linux-androideabi-strip... arm-linux-androideabi-strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether UID '1000' is supported by ustar format... yes
checking whether GID '1000' is supported by ustar format... yes
checking how to create a ustar tar archive... gnutar
checking for arm-linux-androideabi-gcc... /home/cfv/Android/Sdk/ndk/20.0.5594570/toolchains    /llvm/prebuilt/linux-x86_64/bin/clang --sysroot=/home/cfv/Android/Sdk/ndk/20.0.5594570/platforms/android-21/arch-arm
checking whether the C compiler works... no
configure: error: in `/home/cfv/projects/ext/try-to-build-protobuf/protobuf':
configure: error: C compiler cannot create executables
See `config.log' for more details
make: *** No targets specified and no makefile found.  Stop.
make: *** No rule to make target 'install'.  Stop.

И детали config.log:

configure:3866: checking whether the C compiler works
configure:3888: /home/cfv/Android/Sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --sysroot=/home/cfv/Android/Sdk/ndk/20.0.5594570/platforms/android-21/arch-arm -D__ANDROID_API__=21 -target armv7-none-linux-androideabi -march=armv7-a -nostdlib++ -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -Wl,--exclude-libs,libunwind.a   conftest.c -llog -lz >&5
clang: warning: argument unused during compilation: '-nostdlib++' [-Wunused-command-line-argument]
/home/cfv/Android/Sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lunwind
/home/cfv/Android/Sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lunwind
clang: error: linker command failed with exit code 1 (use -v to see invocation)
configure:3892: $? = 1
configure:3930: result: no
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "Protocol Buffers"
| #define PACKAGE_TARNAME "protobuf"
| #define PACKAGE_VERSION "3.6.0"
| #define PACKAGE_STRING "Protocol Buffers 3.6.0"
| #define PACKAGE_BUGREPORT "protobuf@googlegroups.com"
| #define PACKAGE_URL ""
| #define PACKAGE "protobuf"
| #define VERSION "3.6.0"
| /* end confdefs.h.  */
| 
| int
| main ()
| {
| 
|   ;
|   return 0;
| }
configure:3935: error: in `/home/cfv/projects/ext/try-to-build-protobuf/protobuf':
configure:3937: error: C compiler cannot create executables

Я думаю, что мне не хватает некоторых опций компилятора (я особенно подозрительно -Wl,--exclude-libs,libunwind.a) но я боролся с этим весь день, и это далеко за моей зоной комфорта.

У кого-нибудь когда-нибудь была подобная проблема, и смог бы мне помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...