我正在为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)
答案 0 :(得分:2)
正如我在评论中所提到的,一个选项是每个目标架构使用一个构建目录
{{1}}
这将导致树看起来有点像下面的
{{1}}