一. CMake编译原理
CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))。因此CMake的编译基本就两个步骤:
cmake
make
cmake 指向CMakeLists.txt所在的目录,例如cmake .. /表示CMakeLists.txt在当前目录的上一级目录。cmake后会生成很多编译的中间文件以及makefile文件,所以一般建议新建一个新的目录,专门用来编译,例如:
mkdir build
cd build
cmake ../
make
make根据生成makefile文件,编译程序。
二. CMakeLists.txt文件编写
#表示注释
#cmake file for project association
#cmake 最低版本要求,低于2.8 构建过程会被终止。
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
#定义工程名称
PROJECT(association)
#打印相关消息消息
#MESSAGE(STATUS "Project: ${PROJECT_NAME}")
#MESSAGE(STATUS "Project Directory: ${PROJECT_SOURCE_DIR}")
#指定编译类型debug版
SET(CMAKE_BUILE_TYPE DEBUG)
#发行版
#SET(CMAKE_BUILE_TYPE RELEASE)
#SET(CMAKE_C_FLAGS_DEBUG "-g -Wall") #C
#SET(CMAKE_CXX_FLAGS_DEBUG "-g -Wall") #C++
#设置C++ 编译
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -s -Wall -W -O3")
#添加子目录
ADD_SUBDIRECTORY(src/include)
#设置变量,表示所有的源文件
SET(SOURCE_FILES
src/main.cpp
)
#配置相关库文件的目录,
LINK_DIRECTORIES(
/usr/local/lib
)
#找BZip2
FIND_PACKAGE(BZip2)
if (BZIP2_FOUND)
MESSAGE(STATUS "${BZIP_INCLUDE_DIRS}")
MESSAGE(STATUS " ${BZIP2_LIBRARIES}")
endif (BZIP2_FOUND)
if (NOT BZIP2_FOUND)
MESSAGE(STATUS "NOT BZIP2_FOUND")
endif (NOT BZIP2_FOUND)
#相关头文件的目录
INCLUDE_DIRECTORIES(
/usr/local/include
${PROJECT_SOURCE_DIR}/utility_inc
${BZIP_INCLUDE_DIRS}
)
#链接库
LINK_LIBRARIES(
${PROJECT_SOURCE_DIR}/static_libs/libSentinelKeys64.a
${BZIP2_LIBRARIES}
)
#生成可执行文件
ADD_EXECUTABLE(${PROJECT_NAME} ${SOURCE_FILES})
#依赖的库文件
TARGET_LINK_LIBRARIES(${PROJECT_NAME} eventloop)
三. 子目录CMakeLists.txt文件编写
SET(EVENTLOOP_SOURCE_FILES
tool/BlockingQueue.hpp
tool/Copyable.h
tool/ExecuteState.h
tool/Likely.h
EventLoop.h
EventLoop.cpp
)
#生成静态链接库eventloop
ADD_LIBRARY(eventloop ${EVENTLOOP_SOURCE_FILES})