Cmake

801 阅读2分钟

将第三方库打包成Android可用的so动态库

  • protobuf
cd protobuf-3.14.0/
#export ndk_root=/home/tang/Documents/protobuf/android-ndk-r21b
export ndk_root=/home/tang/Android/Sdk/ndk/21.3.6528147
cmake \
-Dprotobuf_BUILD_SHARED_LIBS=ON \
-Dprotobuf_BUILD_STATIC_LIBS=ON \
-DCMAKE_VERBOSE_MAKEFILE=ON \
-Dprotobuf_BUILD_TESTS=OFF \
-Dprotobuf_BUILD_EXAMPLES=OFF \
-DCMAKE_TOOLCHAIN_FILE=$ndk_root/build/cmake/android.toolchain.cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=lib \
-DANDROID_NDK=$ndk_root \
-DANDROID_TOOLCHAIN=clang \
-DANDROID_ABI=arm64-v8a \
-DANDROID_NATIVE_API_LEVEL=23 \
-DANDROID_STL=c++_shared \
-DANDROID_LINKER_FLAGS="-landroid -llog" \
-DANDROID_CPP_FEATURES="rtti exceptions" \
./cmake
make

编译arm64-v8a架构动态库脚本:

cd fftw-3.3.9/
export NDK_DIR="/home/xy/Android/Sdk/ndk/22.0.7026061"
export SYS_ROOT="$NDK_DIR/platforms/android-21/arch-arm64/"
export INSTALL_DIR="`pwd`/build"
export CC="aarch64-linux-android-gcc-4.9 --sysroot=$SYS_ROOT"
export LD="aarch64-linux-android-ld"
export AR="aarch64-linux-android-ar"
export RANLIB="aarch64-linux-android-ranlib"
export STRIP="aarch64-linux-android-strip"
export CFLAGS="-march=armv8-a"

mkdir -p $INSTALL_DIR
sudo ./configure --host=aarch64-linux-android     
--prefix=$INSTALL_DIR   
LIBS="-lc -lgcc"  
--enable-shared  
--enable-float

sudo make
sudo make install

编译armeabi-v7a :

cd fftw-3.3.9/
export NDK_DIR="/home/xy/Android/Sdk/ndk/22.0.7026061"
export SYS_ROOT="$NDK_DIR/platforms/android-21/arch-arm/"
export INSTALL_DIR="`pwd`/build"
export CC="arm-linux-androideabi-gcc-4.9 --sysroot=$SYS_ROOT"
export LD="arm-linux-androideabi-ld"
export AR="arm-linux-androideabi-ar"
export RANLIB="arm-linux-androideabi-ranlib"
export STRIP="arm-linux-androideabi-strip"
export CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon -fno-builtin-memmove -mthumb"

mkdir -p $INSTALL_DIR
 sudo ./configure --host=arm-linux-androideabi   --prefix=$INSTALL_DIR         LIBS="-lc -lgcc"     --enable-shared        --enable-float
sudo make
sudo make install

链接FFTW

将fftw3.h复制到项目中

cmake_minimum_required(VERSION 3.16) # 设置Cmake最低版本
project(test) # 项目的名字
set(CMAKE_CXX_STANDARD 11) # 指定C++版本
target_include_directories(test
        fftw3
        )
target_link_libraries(test
        fftw3
        )

链接dlib

cmake_minimum_required(VERSION 3.16) # 设置Cmake最低版本
project(test) # 项目的名字
set(CMAKE_CXX_STANDARD 11) # 指定C++版本
find_package(dlib REQUIRED) # 寻找dlib
target_include_directories(test PUBLIC
        dlib::dlib 
        )
target_link_libraries(test
        dlib::dlib
        )

链接protobuf

cmake_minimum_required(VERSION 3.16) # 设置Cmake最低版本
project(test) # 项目的名字
set(CMAKE_CXX_STANDARD 11) # 指定C++版本
find_package(Protobuf REQUIRED) # 寻找Protobuf
if(PROTOBUF_FOUND)
    message(STATUS "protobuf library found")
else()
    message(FATAL_ERROR "protobuf library is needed but cant be found")
endif()
include_directories(${PROTOBUF_INCLUDE_DIRS})
target_include_directories(test PUBLIC
        ${PROTOBUF_INCLUDE_DIRS} # 包含protobuf头文件
        )
target_link_libraries(test
        ${PROTOBUF_LIBRARIES} # 链接protobuf
        )

链接opencv

cmake_minimum_required(VERSION 3.16) # 设置Cmake最低版本
project(test) # 项目的名字
set(CMAKE_CXX_STANDARD 11) # 指定C++版本
# for mac
#set(OpenCV_DIR /usr/local/Cellar/opencv/4.5.0_5)
find_package(OpenCV REQUIRED) # 寻找OpenCV

target_include_directories(test PUBLIC
        ${OpenCV_INCLUDE_DIRS} # 包含OpenCV头文件
        )
target_link_libraries(test
        ${OpenCV_LIBS} # 链接opencv
        )

cmake 编译Release版本:

cmake .. -DCMAKE_BUILD_TYPE=Release
make

基本语法

cmake_minimum_required(VERSION 3.4.1)

#添加native-lib库
add_library(
            native-lib
            SHARED
            src/main/cpp/native-lib.cpp )
#相关的头文件路径
include_directories(src/main/cpp/include/)

#添加NDK API 包含NDK库,可以使用其中任何API
#提供使用的库的名称,将其与自己的原生库相关联
find_library(
            log-lib
            log )
#使自己的原生库能够调用log库的函数,将NDK库和自己的库关联
target_link_libraries(
            native-lib
            ${log-lib} )

#将源代码编译到原生库中
add_library( app-glue
            STATIC
            ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c )
target_link_libraries(
            native-lib
            app-glue
            ${log-lib} )

#添加其他预构建库,只是将此库导入到项目中去
add_library( imported-lib
            SHARED
            IMPORTED )
#指定库的路径
set_target_properties(
            imported-lib
            PROPERTIES IMPORTED_LOCATION
            imported-lib/src/${ANDROID_ABI}/libimported-lib.so )
#定位头文件并包含
include_directories( imported-lib/include/ )
#将预构建库关联到自己的原生库
target_link_libraries( native-lib imported-lib app-glue ${log-lib} )

#包含其他CMake项目
set( lib_src_DIR ../gmath )
set( lib_build_DIR ../gmath/outputs )
file(MAKE_DIRECTORY ${lib_build_DIR})
add_subdirectory(
            ${lib_src_DIR}
            ${lib_build_DIR} )
add_library( lib_gmath STATIC IMPORTED )
set_target_properties( lib_gmath PROPERTIES IMPORTED_LOCATION
            ${lib_build_DIR}/${ANDROID_ABI}/lib_gmath.a )
include_directories( ${lib_src_DIR}/include )
target_link_libraries( native-lib ... lib_gmath )

将example.cpp生成.so文件

将需要开放调用的方法用extern “C”{}括起来

add_library(test SHARED src/example.cpp)
find_package(OpenCV REQUIRED COMPONENTS core videoio)

target_include_directories(test PUBLIC
        ${OpenCV_INCLUDE_DIRS}
        )
target_link_libraries(test
        ${OpenCV_LIBS}   
        )

链接第三方SO库

cmake_minimum_required(VERSION 2.8.12)

PROJECT (main)

# 可执行文件,执行main.c
ADD_EXECUTABLE(main main.c)

# 链接头文件
INCLUDE_DIRECTORIES(/usr/include/hello)

# 静态链接库

# TARGET_LINK_LIBRARIES(main libhello.a)

# 动态链接库

set(LINK_DIR /usr/local/lib)

link_directories(${LINK_DIR})

target_link_libraries(main libhello.so)

Android Studio build.gradle 中配置 cmake,及各 arguments 详解

blog.csdn.net/afei__/arti…

Clion (ubuntu) 在CLION编译器中配置CMAKELISTS

www.freesion.com/article/558…