cmake - 一次定位多个体系结构,无需在构建之间进行手动清理

时间:2017-11-06 21:38:50

标签: android c++ cmake android-ndk

我正在为Android和iOS开发一个跨平台的C ++库,我正在使用cmake来准备构建脚本。

项目结构类似于:

somelib
|
├─ .gitignore
|
├── src
│   └── CMakeLists.txt
│   └── Doxyfile.in
|   └── include (Public headers)
│       └── somelib
│           └── somelib.hpp
│   └── somelib
│       └── CMakeLists.txt
│       └── somelib.cpp
│       └── ....hpp, ....cpp
│       └── test
│           └── test_classname.cpp
│   └── libs (source of 3rd party libs)
│       └── 3rd_party_lib_1
│           └── CMakeLists.txt
│           └── ...
│       └── ...
│           └── CMakeLists.txt
│           └── ...
│_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
├── toolchains
│   └── andoid
│       └── android.toolchain.cmake
│       └── ...
│   └── ios
│       └── ios.toolchain.cmake
│       └── ...
│_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
│
├── build
│   └── build.sh
│   └── Doxyfile
│   └── ...
│_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
├── dist (distribute)
│   └── docs
│       └── index.html
│       └── ...
|   └── include (Public headers)
│       └── somelib.hpp
│   └── local
|       └── somelibtest (executable tests)
│   └── android
│       └── Debug
│           └── armeabi
│           └── armeabi-v7a
│           └── ...
│       └── Release
│           └── armeabi
│           └── armeabi-v7a
│           └── ...
│   └── ios
│       └── Debug
│           └── armv
│           └── armv7
│           └── ...
│       └── Release
│           └── armv
│           └── armv7
│           └── ...
|

我通过执行build.sh从./build / path运行cmake,在构建android的情况下,看起来像这样:

build.sh:

...

TARGETS="armeabi-v7a armeabi x86 mips arm64-v8a mips64"

mkdir -p "$BUILD_PATH"

for TARGET in $TARGETS
do

    cmake -DANDROID_NATIVE_API_LEVEL=${ANDROID_NATIVE_API_LEVEL} -DCMAKE_TOOLCHAIN_FILE=${ANDROID_TOOLCHAIN} -DANDROID_NDK=${ANDROID_NDK} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DANDROID_ABI=${TARGET} -DPROJ_HOME=${PROJ_HOME} ../src

    make -j32

  done

fi
...

如果我正在构建一个特定的体系结构,例如仅将TARGETS设置为“arm64-v8a”,则库可以很好地构建。如果我想同时为多个体系结构构建一个库,那么它就不能很好地工作,因为cmake专门为每个平台/体系结构准备了构建脚本。我在构建过程中遇到链接器错误,例如“不兼容的目标”。

构建面向多个平台和多架构的库的最佳做法是什么?

在准备构建其他架构之前,如何避免清除构建脚本文件?

感谢您的任何建议!

PS:以下是主src / CmakeLists.txt文件中的一些行:

cmake_minimum_required(VERSION 3.6.0 FATAL_ERROR)

include(GNUInstallDirs)

# Set default build type
if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE "Release")
endif()

## Output directories

if (IOS)
  set(REL_OUTPUT_DIR "ios/${CMAKE_BUILD_TYPE}/${IOS_ARCH}")
elseif (ANDROID)
  set(REL_OUTPUT_DIR "android/${CMAKE_BUILD_TYPE}/${ANDROID_ABI}")
else()
  set(REL_OUTPUT_DIR "local")
endif()
set(OUTPUT_DIR ${CMAKE_BINARY_DIR}/../dist/${REL_OUTPUT_DIR})
set(DESTDIR ${CMAKE_BINARY_DIR}/../dist/${REL_OUTPUT_DIR})

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${OUTPUT_DIR}") # Static libraries
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${OUTPUT_DIR}") # Dynamic libraries
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${OUTPUT_DIR}") # Executables

# Include libraries
add_subdirectory(libs/3rd_party_lib_1)
add_subdirectory(libs/3rd_party_lib_n)

1 个答案:

答案 0 :(得分:2)

正如我在评论中所提到的,一个选项是每个目标架构使用一个构建目录

{{1}}

这将导致树看起来有点像下面的

{{1}}