2017-11-06 5 views
0

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) 
+0

을 사용하십시오. 아키텍처 별 빌드 디렉토리 (타겟 당 빌드 디렉토리 1 개)를 사용하십시오. –

+0

'mkdir -p "$ {BUILD_PATH}/$ {TARGET}"' –

+0

감사합니다. 이 줄은 실제로 빌드 디렉토리가 빌드 과정에서 자동으로 만들어지기 때문에별로 효과가 없습니다. 뭔가 CmakeLists.txt 파일에서 수행되어야합니다 같아요. 기본 CmakeLists.txt 파일에서 몇 줄을 추가했습니다. –

답변

1

의 옵션 나는 의견에 회피로, 목표 아키텍처

당 하나의 빌드 디렉토리를 사용하는 것입니다, 다음은 주요 SRC/CmakeLists.txt 파일의 일부 라인은
... 

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

for TARGET in ${TARGETS} 
do  
    # create one build dir per target architecture 
    mkdir -p ${BUILD_PATH}/${TARGET} 
    cd ${BUILD_PATH}/${TARGET} 

    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 

    cd -  
done 

... 

이 나무에 발생합니다 다음

project/ 
+--- src/ 
+--- build/ 
    +--- armeabi-v7a/ 
    +--- armeabi/ 
    +--- x86/ 
    +--- mips/ 
    +--- arm64-v8a/ 
    +--- mips64/ 
처럼 다소 찾고
+0

이것은 완벽한 대답입니다. 정말 고마워요, 스티브! 내가 한 유일한 변화는 $ {BUILD_PATH} 대신 $ {SCRIPTPATH}를 설정 했으므로 새 변수를 설정할 필요가 없지만 bash 환경에서 기존 변수를 사용할 필요가 없다는 것입니다. –

+0

질문에 답변이있는 경우 동의하십시오 (질문 왼쪽의 녹색 체크 표시를 클릭하십시오) –