ceres-solver / ceres-solver

A large scale non-linear optimization library

Home Page:http://ceres-solver.org/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

After compiling Ceres using Android NDK, linking the program to Ceres and using std::cout will cause a crash.

lyfadvance opened this issue · comments

code:

#include<iostream>
int main()
{
	int i = 0;
	std::cout << "success " << i << std::endl;
	return 0;
}

exec this program in mobile phone terminal, the result is:

HWTAS:/data/local/tmp $ ./main                                                 
Segmentation fault 

CMakeLists.txt is:

cmake_minimum_required(VERSION 2.8.3)
project(vins)

set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-std=c++11")
#-DEIGEN_USE_MKL_ALL")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")

set(Eigen3_DIR "/home/admin/software/eigen-3.3.7/android_install/share/eigen3/cmake")
find_package(Eigen3)
set(EIGEN3_INCLUDE_DIR "/home/admin/software/eigen-3.3.7/android_install/include")

set(Ceres_DIR "/home/admin/software/ceres-solver-2.1.0/android_install/lib/cmake/Ceres")
find_package(Ceres REQUIRED)

include_directories(${CERES_INCLUDE_DIRS})

add_executable(main src/main.cpp)
target_link_libraries(main ${CERES_LIBRARIES})

scrip used to compile ceres is :

#!/usr/bin/env sh
set -x

NDK_PATH="/home/admin/software/android-ndk/android-ndk-r23b"
CMAKE_TOOLCHAIN_PATH="${NDK_PATH}/build/cmake/android.toolchain.cmake"
INSTALL_PATH="/home/admin/software/ceres-solver-2.1.0/android_install"

rm -rf ${INSTALL_PATH}

rm -rf build_android
mkdir -p build_android
cd build_android

ARCH_ABI=arm64-v8a
API_LEVEL=26
echo "----------------------------------"
echo ${API_LEVEL}
cmake \
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_PATH} \
-DANDROID_ABI=${ARCH_ABI} \
-DANDROID_NDK=${NDK_PATH} \
-DANDROID_PLATFORM="android-${API_LEVEL}" \
-DANDROID_NATIVE_API_LEVEL=${API_LEVEL} \
-DANDROID_STL=c++_shared \
-DBUILD_SHARED_LIBS=ON \
-DMINIGLOG=ON \
-DCMAKE_INSTALL_PREFIX=${INSTALL_PATH} ..
make clean
make -j8
make install

I found the reason. When compiling ceres, I used the option Dandroid_ STL=c++_ shared。 Therefore, when compiling main, it is also necessary to turn on this option. In addition, you need to copy the libc++shared.so in the ndk used to the Android phone.