一. CMake編譯原理
??CMake是一種跨平臺(tái)編譯工具,比make更為高級(jí),使用起來(lái)要方便得多。CMake主要是編寫CMakeLists.txt文件,然后用cmake命令將CMakeLists.txt文件轉(zhuǎn)化為make所需要的makefile文件,最后用make命令編譯源碼生成可執(zhí)行程序或共享庫(kù)(so(shared object))。因此CMake的編譯基本就兩個(gè)步驟:
cmake
make
??cmake 指向CMakeLists.txt所在的目錄,例如cmake .. /表示CMakeLists.txt在當(dāng)前目錄的上一級(jí)目錄。cmake后會(huì)生成很多編譯的中間文件以及makefile文件,所以一般建議新建一個(gè)新的目錄,專門用來(lái)編譯,例如:
mkdir build
cd build
cmake ../
make
make根據(jù)生成makefile文件,編譯程序。
二. CMakeLists.txt文件編寫
#表示注釋
#cmake file for project association
#cmake 最低版本要求,低于2.8 構(gòu)建過(guò)程會(huì)被終止。
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
#定義工程名稱
PROJECT(association)
#打印相關(guān)消息消息
#MESSAGE(STATUS "Project: ${PROJECT_NAME}")
#MESSAGE(STATUS "Project Directory: ${PROJECT_SOURCE_DIR}")
#指定編譯類型debug版
SET(CMAKE_BUILE_TYPE DEBUG)
#發(fā)行版
#SET(CMAKE_BUILE_TYPE RELEASE)
#SET(CMAKE_C_FLAGS_DEBUG "-g -Wall") #C
#SET(CMAKE_CXX_FLAGS_DEBUG "-g -Wall") #C++
#設(shè)置C++ 編譯
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -s -Wall -W -O3")
#添加子目錄
ADD_SUBDIRECTORY(src/include)
#設(shè)置變量,表示所有的源文件
SET(SOURCE_FILES
src/main.cpp
)
#配置相關(guān)庫(kù)文件的目錄,
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)
#相關(guān)頭文件的目錄
INCLUDE_DIRECTORIES(
/usr/local/include
${PROJECT_SOURCE_DIR}/utility_inc
${BZIP_INCLUDE_DIRS}
)
#鏈接庫(kù)
LINK_LIBRARIES(
${PROJECT_SOURCE_DIR}/static_libs/libSentinelKeys64.a
${BZIP2_LIBRARIES}
)
#生成可執(zhí)行文件
ADD_EXECUTABLE(${PROJECT_NAME} ${SOURCE_FILES})
#依賴的庫(kù)文件
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
)
#生成靜態(tài)鏈接庫(kù)eventloop
ADD_LIBRARY(eventloop ${EVENTLOOP_SOURCE_FILES})