0. CMake多级目录下工程实现
本文记录了某工程项目中cmake的学习过程及结果,主要涉及cmake的安装,cmake示例编写和平台构建;
源码下载地址:https://download.csdn.net/download/dodonei/10306612
- CMake 下载安装
- 示例工程目录结构
- CMake Linux 平台构建工程项目
- *CMake Windows平台构建工程项目
1. Cmake安装
Linux安装
(1)下载 https://cmake.org/
(2) 可以通过下载源码,在你的机器上编译安装,最简单方法,是下载二进制安装后的包,拷备到你的机器上解压,设置PATH环境变量即可开始使用;Windows安装
2. 示例工程目录结构
MSLayer为一个静态库,iMM_Cache也为一个静态库,均为动态库,CMakelist的具体实现,清参考源码,include和src中放的源码是示例,你编译时可以放入你自己源码。
MM_SDK/
├── AudioCache
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── AudioCacheAPI.h
│ │ └── StrategySelect.h
│ └── src
│ ├── AudioCacheAPI.cpp
│ └── StrategySelect.cpp
├── CMakeLists.txt
├── EngineCommon
│ ├── adpcm.cpp
│ └── voc_vox.cpp
├── MM_Audio
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── audiolib.h
│ │ └── resource.h
│ └── src
│ ├── audiolib.cpp
│ └── toaulaw.cpp
├── MM_EB9
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── eMMAgent.h
│ │ └── resource.h
│ └── src
│ ├── backaudio.cpp
│ └── Win_Linux_file_func.cpp
├── MM_ML
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── jt_license_rsa.h
│ │ └── tts_proxy_uuid.h
│ └── src
│ ├── jt_license_rsa.cpp
│ └── tts_proxy_uuid.cpp
├── MM_Session
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── audiolib.h
│ │ └── stdafx.h
│ └── src
│ ├── Config.cpp
│ └── tovox.cpp
├── MM_USyn
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── MM_USyn.h
│ │ ├── resource.h
│ │ └── USynAPI.h
│ └── src
│ ├── backaudio.cpp
│ └── MM_USyn.cpp
├── MM_VW
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── MM_VW.h
│ │ └── text_parser.h
│ └── src
│ ├── backaudio.cpp
│ └── text_parser.cpp
└── XXLayer
├── CMakeLists.txt
├── include
│ ├── audio_jtts.h
│ └── UtilStrTool.h
└── src
├── audio_jtts.cpp
└── UtilStrTool.cpp
3. iMM_SDK
PROJECT(iMM_SDK)
CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
SET(SERVER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../../service)
SET(DEPENDS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../../depends)
SET(DEPENDS_NEW ${CMAKE_CURRENT_SOURCE_DIR}/../../../../depends_new)
SET(TTS_SDK_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
SET(TTS_SDK_LIB_PATH ${TTS_SDK_ROOT_PATH}/../deploy/lib)
SET(TTS_SDK_BIN_PATH ${TTS_SDK_ROOT_PATH}/../deploy/bin)
MESSAGE(STATUS "Project root directory:" ${SERVER_ROOT_PATH})
if(DEBUG_FLAG)
SET(DEBUG_FLAG "-g")
SET(BUILD_CONFIGURATION_ "debug")
else()
SET(DEBUG_FLAG "-DNDEBUG")
SET(BUILD_CONFIGURATION "release")
endif()
SET(HCI_WARNINGS_SETTING "-Wall -Wextra -Wno-missing-field-initializers -Wno-deprecated -Wno-unused-parameter -Wno-deprecated-declarations -Wno-unused-function -Wno-unused-variable")
SET(C_CPP_FLAGS_ "${C_CPP_FLAGS_} -static-libstdc++ -std=c++14 -pthread -fPIC -Wl,--no-undefined -O3 -DUSE_COMMON_LIB ${DEBUG_FLAG} ${OS_FLAG} ${HCI_WARNINGS_SETTING}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${C_CPP_FLAGS_}")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${C_CPP_FLAGS_}")
ADD_SUBDIRECTORY(MSLayer)
ADD_SUBDIRECTORY(iMM_Audio)
ADD_SUBDIRECTORY(iMM_ML)
ADD_SUBDIRECTORY(iMM_Session)
ADD_SUBDIRECTORY(iMM_USyn)
ADD_SUBDIRECTORY(iMM_VW)
4. MSLayer
CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
SET(MODULE_NAME MSLayer)
INCLUDE_DIRECTORIES(
${DEPENDS_NEW}/apache-log4cxx-0.10.0/linux_x64/shared/include
${SERVER_ROOT_PATH}/log_wrapper/include
${SERVER_ROOT_PATH}/common/include
${CMAKE_CURRENT_SOURCE_DIR}/include
${SERVER_ROOT_PATH}/include
)
LINK_DIRECTORIES(
${TTS_SDK_BIN_PATH}
${TTS_SDK_LIB_PATH}
${SERVER_ROOT_PATH}/deploy/common/bin
${SERVER_ROOT_PATH}/build/common
)
SET(LIBS
common
)
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCFILE)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
ADD_LIBRARY(
${MODULE_NAME}
STATIC
${SRCFILE}
)
TARGET_LINK_LIBRARIES(${MODULE_NAME} ${LIBS})
5. iM_VW
CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
SET(MODULE_NAME iMM_VW)
INCLUDE_DIRECTORIES(
${TTS_SDK_ROOT_PATH}/EngineCommon
${TTS_SDK_ROOT_PATH}/iMM_Session/include
${TTS_SDK_ROOT_PATH}/MSLayer/include
${TTS_SDK_ROOT_PATH}/iMM/include
${TTS_SDK_ROOT_PATH}/iMM_ML/include
${CMAKE_CURRENT_SOURCE_DIR}/include
${DEPENDS_PATH}/ACE_5_6_6/ACE_wrappers
${DEPENDS_PATH}/iconv/include
${TTS_SDK_ROOT_PATH}/depends/VW/include
)
LINK_DIRECTORIES(
${TTS_SDK_BIN_PATH}
${TTS_SDK_LIB_PATH}
${SERVER_ROOT_PATH}/build/log_wrapper
${SERVER_ROOT_PATH}/build/common
)
SET(LIBS
log_wrapper
common
ACE
OSLayer
iMM
dl
)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_DUMMY_SDK_ -DUSE_DUMMY_SLB_")
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCFILE )
ADD_LIBRARY(${MODULE_NAME} SHARED ${SRCFILE})
TARGET_LINK_LIBRARIES(${MODULE_NAME} ${LIBS})
6. iMM_ML
CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
SET(MODULE_NAME iMM_ML)
INCLUDE_DIRECTORIES(
${TTS_SDK_ROOT_PATH}/EngineCommon
${DEPENDS_PATH}/ACE_5_6_6/ACE_wrappers
${DEPENDS_NEW}/apache-log4cxx-0.10.0/linux_x64/shared/include
${DEPENDS_NEW}/libevent-2.1.8/linux_x64/static/include
${DEPENDS_NEW}/protobuf-2.5.0/linux_x64/static/include
${DEPENDS_NEW}/openssl-1.0.2l/linux_x64/static/include
${DEPENDS_NEW}/jsoncpp-1.8.3/linux_x64/static/include
${DEPENDS_NEW}/tinyxml-2.6.2/linux_x64/static/include
${SERVER_ROOT_PATH}/log_wrapper/include
${SERVER_ROOT_PATH}/common/include
${SERVER_ROOT_PATH}/tcpclient_synch/include
${SERVER_ROOT_PATH}/hcicloud_protocol/include
${SERVER_ROOT_PATH}/network/include
${SERVER_ROOT_PATH}/modules/liblicense_server/include
${SERVER_ROOT_PATH}/LicenseServerTool/jtRSA/include
${SERVER_ROOT_PATH}/LicenseServerTool/depends/rockey/include
${SERVER_ROOT_PATH}/liblicense_server_sdk_public/include
${TTS_SDK_ROOT_PATH}/iMM_ML/include
${TTS_SDK_ROOT_PATH}/iMM_Session/include
${TTS_SDK_ROOT_PATH}/OSLayer/include
${TTS_SDK_ROOT_PATH}/iMM_Audio/include
${CMAKE_CURRENT_SOURCE_DIR}/include
${DEPENDS_PATH}/iconv/include
)
LINK_DIRECTORIES(
${TTS_SDK_BIN_PATH}
${TTS_SDK_LIB_PATH}
${DEPENDS_NEW}/jsoncpp-1.8.3/linux_x64/static/lib
${DEPENDS_NEW}/zlib-1.2.11/linux_x86_64/shared/lib
${SERVER_ROOT_PATH}/build/log_wrapper
${SERVER_ROOT_PATH}/deploy/common/bin
${SERVER_ROOT_PATH}/build/common
${SERVER_ROOT_PATH}/LicenseServerTool/depends/rockey/lib/linux_x64
${SERVER_ROOT_PATH}/LicenseServerTool/depends/rockey/lib/linux_x64
${DEPENDS_NEW}/openssl-1.0.2l/linux_x64/static/lib
${DEPENDS_NEW}/jsoncpp-1.8.3/linux_x64/static/lib
${DEPENDS_NEW}/libevent-2.1.8/linux_x64/static/lib
${SERVER_ROOT_PATH}/build/network
${DEPENDS_NEW}/tinyxml-2.6.2/linux_x64/static/lib
${SERVER_ROOT_PATH}/build/tcpclient_synch
${DEPENDS_NEW}/protobuf-2.5.0/linux_x64/static/lib
${SERVER_ROOT_PATH}/build/hcicloud_protocol
)
SET(LIBS
hcicloud_protocol
protobuf
tinyxml
crypto
common
iMM_Session
dl
z
)
#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_DUMMY_SDK_ -DUSE_DUMMY_SLB_")
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRCFILE )
ADD_LIBRARY(${MODULE_NAME} SHARED ${SRCFILE})
TARGET_LINK_LIBRARIES(${MODULE_NAME} ${LIBS})
SET(LOG_FILE "log.txt")
ADD_CUSTOM_COMMAND(
OUTPUT ${LOG_FILE}
COMMAND ${DEPENDS_NEW}/tools/patchelf --set-rpath ${GLIBC_RPATH} --force-rpath ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_NAME} 2>/dev/null
COMMAND mkdir -p ${TTS_SDK_SO_PATH} && cp -rf ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_NAME} ${TTS_SDK_SO_PATH}
)