Android 및 iOS 용 교차 플랫폼 C++ 라이브러리를 개발 중이며 cmake를 사용하여 빌드 스크립트를 준비 중입니다.cmake - 빌드 사이에서 수동으로 정리하지 않고 한꺼번에 여러 아키텍처를 대상으로 지정
: 나는 안드로이드를위한 건물의 경우, 다음과 같이 보입니다 build.sh를 실행하여 ./build/ 경로에서 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 :
...
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
...
내가 아니라 대상에 "arm64 - v8a"전용 라이브러리 builts 설정 예를 들어, 하나의 특정 아키텍처 건물입니다 경우. 한 번에 여러 아키텍처에 대한 라이브러리를 빌드하려는 경우 cmake가 각 플랫폼/아키텍처에 맞게 스크립트를 준비하기 때문에 즉시 작동하지 않습니다. 나는 "호환되지 않는 대상"과 같은 링커 오류를 빌드를 취하지 않게합니다.
여러 플랫폼 및 다중 아키텍처를 대상으로 라이브러리를 빌드하는 가장 좋은 방법은 무엇입니까?
다른 아키텍처 용으로 빌드하기 전에 빌드 스크립트 파일을 정리하지 않으려면 어떻게해야합니까?
의견을 보내 주셔서 감사합니다.
PS :
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 개)를 사용하십시오. –
'mkdir -p "$ {BUILD_PATH}/$ {TARGET}"' –
감사합니다. 이 줄은 실제로 빌드 디렉토리가 빌드 과정에서 자동으로 만들어지기 때문에별로 효과가 없습니다. 뭔가 CmakeLists.txt 파일에서 수행되어야합니다 같아요. 기본 CmakeLists.txt 파일에서 몇 줄을 추가했습니다. –