【问题标题】:How to build PCL for different ABIs如何为不同的 ABI 构建 PCL
【发布时间】:2019-11-17 07:51:28
【问题描述】:

我已经使用来自https://github.com/bashbug/pcl-for-android 的超级构建成功构建了点云库

使用 armeabi-v7a ABI 的 PCL 构建。如何为其他 ABI 构建?

我曾尝试更改pcl-build-for-android.sh 脚本,但没有成功。我改变了脚本的第一行:

#!/bin/bash

# specify the arm as abi, the api level for android kitkat as used by
# google tango and with gnustl_static the c++ support
# for more information look into the android.toolchain.cmake file
export ANDROID_ABI="arm64-v8a"
export ANDROID_NATIVE_API_LEVEL=android-19
export ANDROID_STL=gnustl_static
export ANDROID_STL_FORCE_FEATURES=ON
...

但每次它构建默认的armeabi-v7a 版本。我已经尝试过多次清洁和重建。

有什么帮助吗?

【问题讨论】:

  • 嗨@vp24 我是存储库的维护者并更新了为arm64-v8a编译的脚本。

标签: android cmake android-ndk point-cloud-library abi


【解决方案1】:

尝试将api级别修改为21,例如

export ANDROID_NATIVE_API_LEVEL=android-21

因为,从 api 21 开始,Android 支持 64 位 ABI。

【讨论】:

    【解决方案2】:

    该构建脚本不适用于现代 NDK,但可以很容易地制作(下面的补丁)。有了它,我确实看到它是为 arm64 构建的,所以大概你的问题是他们旧的 cmake 工具链文件的一个错误(移动到现代 NDK 需要移动到 NDK 提供的那个而不是那个有效的存储库)。

    不幸的是,存储库还存在许多其他问题(代码中的一些细微错误并非在所有平台/编译器上都可见,但在为 Android 构建时会显示出来)。它们似乎在很大程度上是微不足道的修复。

    diff --git a/pcl-build-for-android.sh b/pcl-build-for-android.sh
    index f4f1a70..da6ac84 100755
    --- a/pcl-build-for-android.sh
    +++ b/pcl-build-for-android.sh
    @@ -3,12 +3,11 @@
     # specify the arm as abi, the api level for android kitkat as used by
     # google tango and with gnustl_static the c++ support
     # for more information look into the android.toolchain.cmake file
    -export ANDROID_ABI="armeabi armeabi-v7a with NEON"
    -export ANDROID_NATIVE_API_LEVEL=android-19
    -export ANDROID_STL=gnustl_static
    -export ANDROID_STL_FORCE_FEATURES=ON
    +ANDROID_ABI="arm64-v8a"
    +MIN_SDK_VERSION=19
    +ANDROID_STL=c++_static
    
    -export CFLAGS="-pipe -w"
    +export CFLAGS="-w"
     export CXXFLAGS=${CFLAGS}
    
     [[ -z "${jobs}" ]] && jobs=$(grep -cP '^processor' /proc/cpuinfo)
    @@ -25,7 +24,7 @@ fi
     cd build
    
     ROOT=${PWD}
    -ANDROIDTOOLCHAIN=${ROOT}/../android.toolchain.cmake
    +ANDROIDTOOLCHAIN=${ANDROID_NDK}/build/cmake/android.toolchain.cmake
    
     EIGEN_INCLUDE_DIR=${ROOT}/eigen # eigen needs no cross-compiling
     FLANN_ROOT=${ROOT}/flann
    @@ -42,10 +41,23 @@ cmake . -DCMAKE_BUILD_TYPE:STRING=Release \
       -DCMAKE_TOOLCHAIN_FILE:FILEPATH=$ANDROIDTOOLCHAIN \
       -DBUILD_EXAMPLES:BOOL=OFF \
       -DBUILD_PYTHON_BINDINGS:BOOL=OFF \
    -  -DBUILD_MATLAB_BINDINGS:BOOL=OFF
    +  -DBUILD_MATLAB_BINDINGS:BOOL=OFF \
    +  -DANDROID_ABI=$ANDROID_ABI \
    +  -DANDROID_PLATFORM=android-$MIN_SDK_VERSION \
    +  -DANDROID_STL=$ANDROID_STL \
    +
    +if [ $? -ne 0 ]; then
    +  echo >&2 Build failed
    +  exit 1
    +fi
    
     make -j${jobs}
    
    +if [ $? -ne 0 ]; then
    +  echo >&2 Build failed
    +  exit 1
    +fi
    +
     cd ..
     echo "FLANN cross-compiling finished!"
    
    @@ -72,10 +84,23 @@ cd ${BOOST_ROOT}
    
     cmake . -DCMAKE_BUILD_TYPE:STRING=Release \
       -DCMAKE_TOOLCHAIN_FILE:FILEPATH=$ANDROIDTOOLCHAIN \
    -  -DBUILD_SHARED_LIBS:BOOL=OFF
    +  -DBUILD_SHARED_LIBS:BOOL=OFF \
    +  -DANDROID_ABI=$ANDROID_ABI \
    +  -DANDROID_PLATFORM=android-$MIN_SDK_VERSION \
    +  -DANDROID_STL=$ANDROID_STL \
    +
    +if [ $? -ne 0 ]; then
    +  echo >&2 Build failed
    +  exit 1
    +fi
    
     make -j${jobs}
    
    +if [ $? -ne 0 ]; then
    +  echo >&2 Build failed
    +  exit 1
    +fi
    +
     cd ..
     echo "BOOST cross-compiling finished!"
    
    @@ -139,13 +164,22 @@ function cmake_pcl {
         -DBoost_THREAD_LIBRARY=${Boost_LIBRARIES}/libboost_thread.a \
         -DBoost_THREAD_LIBRARY_DEBUGBoost_INCLUDE_DIRS=${Boost_LIBRARIES}/libboost_thread.a \
         -DBoost_THREAD_LIBRARY_RELEASE=${Boost_LIBRARIES}/libboost_thread.a \
    -    -DBoost_LIBRARY_DIRS=${Boost_LIBRARIES}
    +    -DBoost_LIBRARY_DIRS=${Boost_LIBRARIES} \
    +    -DANDROID_ABI=$ANDROID_ABI \
    +    -DANDROID_PLATFORM=android-$MIN_SDK_VERSION \
    +    -DANDROID_STL=$ANDROID_STL \
    +
     }
    
     ### pcl cmake files do not set library paths properly. Therefore cmake has to be run twice.
     cmake_pcl
     cmake_pcl
    
    +if [ $? -ne 0 ]; then
    +  echo >&2 Build failed
    +  exit 1
    +fi
    +
     echo -e "\n\n\033[1;32m make -j$jobs\033[m\n"
     echo -e "\n\n\033[1;32m this will run for a while... time to drink a\n"
     echo -e "   ( ( "
    @@ -157,9 +191,19 @@ echo -e "   '----' \033[m\n\n"
    
     make -j${jobs}
    
    +if [ $? -ne 0 ]; then
    +  echo >&2 Build failed
    +  exit 1
    +fi
    +
    
     echo -e "\n\n\033[1;35m make install\033[m\n\n"
     make install
    
    +if [ $? -ne 0 ]; then
    +  echo >&2 Build failed
    +  exit 1
    +fi
    +
     cd ..
     echo "PCL cross-compiling finished!"
    

    【讨论】:

      猜你喜欢
      • 2016-10-15
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 2016-04-17
      • 1970-01-01
      • 2018-04-08
      相关资源
      最近更新 更多