PocoライブラリはCMakeコンパイルを使用し、NetSSLをサポートする
CMakeプロジェクトにPocoライブラリコンパイルを導入し、テストエンジニアリングファイル構造は以下の通りである.
Openssl各エンド(Android,IOS,Win,MacOS)はgithubからダウンロードできます.
CMakeLists.txt内容:
Androidエンドコンパイル
IOSエンドコンパイル:
そのうちios.toolchain.cmakeはGitHubからダウンロードできます.
test
|--cmake
|-- ios.toolchain.cmake
|-- test.cc
|-- test.h
|--CMakeLists.txt
|--third_party
|-- poco
|-- openssl
Openssl各エンド(Android,IOS,Win,MacOS)はgithubからダウンロードできます.
https://github.com/vintonliu/openssl-libs.git
CMakeLists.txt内容:
# CMakeList.txt : Top-level CMake project file, do global configuration
# and include sub-projects here.
#
cmake_minimum_required (VERSION 3.8)
project ("test")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# openssl need for poco net ssl
set(OPENSSL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/openssl")
set(SSL_NAME "libssl.a")
set(CRYPTO_NAME "libcrypto.a")
if(WIN32)
set(SSL_NAME "libssl.lib")
set(CRYPTO_NAME "libcrypto.lib")
if(CMAKE_CL_64)
set(OPENSSL_INCLUDE_DIR "${OPENSSL_DIR}/pc/x64/include")
set(OPENSSL_LIB_DIR "${OPENSSL_DIR}/pc/x64/lib")
else()
set(OPENSSL_INCLUDE_DIR "${OPENSSL_DIR}/pc/x86/include")
set(OPENSSL_LIB_DIR "${OPENSSL_DIR}/pc/x86/lib")
endif(CMAKE_CL_64)
elseif(ANDROID)
set(OPENSSL_INCLUDE_DIR "${OPENSSL_DIR}/android/${ANDROID_ABI}/include")
set(OPENSSL_LIB_DIR "${OPENSSL_DIR}/android/${ANDROID_ABI}/lib")
elseif(APPLE)
if(IOS)
set(OPENSSL_INCLUDE_DIR "${OPENSSL_DIR}/ios/include")
set(OPENSSL_LIB_DIR "${OPENSSL_DIR}/ios/lib")
else()
# set(OPENSSL_ROOT_DIR "/usr/local/opt/[email protected]"
set(OPENSSL_INCLUDE_DIR "${OPENSSL_DIR}/mac/include")
set(OPENSSL_LIB_DIR "${OPENSSL_DIR}/mac/lib")
endif(IOS)
endif(WIN32)
set(OPENSSL_INCLUDE_DIR "${OPENSSL_INCLUDE_DIR}" CACHE STRING "openssl include" FORCE)
set(OPENSSL_SSL_LIBRARY "${OPENSSL_LIB_DIR}/${SSL_NAME}" CACHE STRING "ssl library" FORCE)
set(OPENSSL_CRYPTO_LIBRARY "${OPENSSL_LIB_DIR}/${CRYPTO_NAME}" CACHE STRING "crypto library" FORCE)
# poco
set(POCO_STATIC ON CACHE BOOL "Set to OFF|ON (default is OFF) to control build of POCO as STATIC library" FORCE)
set(ENABLE_NETSSL ON CACHE BOOL "Enable NetSSL" FORCE)
set(ENABLE_CRYPTO ON CACHE BOOL "Enable Crypto" FORCE)
set(ENABLE_ENCODINGS OFF CACHE BOOL "Enable Encodings" FORCE)
set(ENABLE_MONGODB OFF CACHE BOOL "Enable MongoDB" FORCE)
set(ENABLE_REDIS OFF CACHE BOOL "Enable Redis" FORCE)
set(ENABLE_PDF OFF CACHE BOOL "Enable PDF" FORCE)
set(ENABLE_DATA OFF CACHE BOOL "Enable Data" FORCE)
set(ENABLE_DATA_SQLITE OFF CACHE BOOL "Enable Data SQlite" FORCE)
set(ENABLE_DATA_MYSQL OFF CACHE BOOL "Enable Data MySQL" FORCE)
set(ENABLE_DATA_ODBC OFF CACHE BOOL "Enable Data ODBC" FORCE)
set(ENABLE_ZIP OFF CACHE BOOL "Enable Zip" FORCE)
set(ENABLE_PAGECOMPILER OFF CACHE BOOL "Enable PageCompiler" FORCE)
set(ENABLE_PAGECOMPILER_FILE2PAGE OFF CACHE BOOL "Enable File2Page" FORCE)
set(ENABLE_XML OFF CACHE BOOL "Enable XML" FORCE)
# ,
if(WIN32)
add_definitions(-DPOCO_WIN32_DEBUGGER_THREAD_NAMES)
else()
add_definitions(-DPOCO_POSIX_DEBUGGER_THREAD_NAMES)
endif()
# poco
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/third_party/poco)
set(Poco_COMPONENTS "")
list(APPEND Poco_COMPONENTS "PocoFoundation")
list(APPEND Poco_COMPONENTS "PocoJSON")
list(APPEND Poco_COMPONENTS "PocoNet")
list(APPEND Poco_COMPONENTS "PocoUtil")
# list(APPEND Poco_COMPONENTS "PocoXML")
list(APPEND Poco_COMPONENTS "PocoNetSSL")
list(APPEND Poco_COMPONENTS "PocoCrypto")
set(SRCS
test.cc
test.h
)
add_executable(test
SHARED
${SRCS} )
target_link_libraries(test
${Poco_COMPONENTS}
)
Androidエンドコンパイル
#!/bin/bash
CWD=`pwd`
BUILD_MODE=$1
if [ -n "$BUILD_MODE" ]
then
BUILD_MODE=Debug
else
BUILD_MODE=MinSizeRel
fi
echo "BUILD_MODE: $BUILD_MODE"
#
# linux, config ANDROID_NDK_R20_ROOT="path to ndkr20" in profile
ANDROID_NDK_TOOLCHAIN_HOME=$ANDROID_NDK_R20_ROOT
# windows ,VSCode, git bash
# ANDROID_NDK_TOOLCHAIN_HOME=/d/Android/sdk/ndk-bundle
CMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_TOOLCHAIN_HOME/build/cmake/android.toolchain.cmake
# CMakeList.txt
SOURCE_PATH=$CWD
#
OBJECT_DIR="$CWD/out/build/android_$BUILD_MODE"
#
INSTALL_DIR="$CWD/out/install/android_$BUILD_MODE"
if [ -n "$1" -a "$1" == "clean" ]; then
echo "rm -rf $CWD/out/build/android"
rm -rf "$CWD/out/build/android*"
exit 0
fi
if [ -d $INSTALL_DIR ]
then
rm -rf $INSTALL_DIR
fi
# cpu
android_toolchains=(
# armeabi is no longer support build
# "armeabi"
"armeabi-v7a"
"arm64-v8a"
"x86"
"x86_64"
)
API=23
PLATFORM_CONFIG="-DANDROID=1 -DCMAKE_SYSTEM_NAME=Android \
-DANDROID_NDK=$ANDROID_NDK_TOOLCHAIN_HOME \
-DANDROID_TOOLCHAIN=clang \
-DCMAKE_TOOLCHAIN_FILE=$CMAKE_TOOLCHAIN_FILE \
-DANDROID_NATIVE_API_LEVEL=$API \
-DCMAKE_BUILD_TYPE=$BUILD_MODE"
BUILD_CONFIG="-DCMAKE_VERBOSE_MAKEFILE=ON"
num=${#android_toolchains[@]}
for((i=0; i<num; i++))
do
echo "************* building ${android_toolchains[i]} ***********"
# create build temp dir
mkdir -p $OBJECT_DIR/${android_toolchains[i]}
mkdir -p $INSTALL_DIR/${android_toolchains[i]}
cd $OBJECT_DIR/${android_toolchains[i]}
PLATFORM_CONFIG="$PLATFORM_CONFIG \
-DANDROID_ABI=${android_toolchains[i]} \
-DCMAKE_INSTALL_PREFIX=$INSTALL_DIR/${android_toolchains[i]}"
cmake -G "Ninja" $PLATFORM_CONFIG $BUILD_CONFIG $SOURCE_PATH
echo "******************** cmake generator done ****************"
#cmake --build .
ninja -j8
echo "******************** cmake build done ********************"
done
IOSエンドコンパイル:
#!/bin/bash
CWD=`pwd`
# BUILD_MODE=Release
BUILD_MODE=MinSizeRel
LINK_MODE=shared
BUILD_MODE=$1
if [ -n "$BUILD_MODE" ]
then
BUILD_MODE=Debug
else
BUILD_MODE=MinSizeRel
fi
# must add -DANDROID=1, else could not generate Android CMakeFiles
PLATFORM_CONFIG="-DCMAKE_TOOLCHAIN_FILE=$CWD/cmake/ios.toolchain.cmake \
-DCMAKE_BUILD_TYPE=$BUILD_MODE \
-DENABLE_BITCODE=0 \
-DENABLE_ARC=0 \
-DCMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM=E8TD92447B \
-DDEPLOYMENT_TARGET=9.0"
PLATFORMS=(
"OS"
"SIMULATOR"
"SIMULATOR64"
)
SOURCE_PATH=$CWD
#
OBJECT_DIR="$CWD/out/build/ios_$BUILD_MODE"
#
INSTALL_DIR="$CWD/out/install/ios_$BUILD_MODE"
rm -rf $INSTALL_DIR
num=${#PLATFORMS[@]}
for((i=0; i<num; i++))
do
PLATFORM_CONFIG="$PLATFORM_CONFIG \
-DCMAKE_INSTALL_PREFIX=$INSTALL_DIR/${PLATFORMS[i]}"
mkdir -p "$OBJECT_DIR/${PLATFORMS[i]}"
cd "$OBJECT_DIR/${PLATFORMS[i]}"
cmake -G"Xcode" $PLATFORM_CONFIG -DPLATFORM=${PLATFORMS[i]} $SOURCE_PATH
cmake --build . --config $BUILD_MODE --target install
done
そのうちios.toolchain.cmakeはGitHubからダウンロードできます.
git clone https://github.com/vintonliu/ios-cmake.git