CMake編譯原理
CMake是一種跨平台編譯工具,比make更為高級,使用起來要方便得多。CMake主要是編寫CMakeLists.txt文件,然后用cmake命令將CMakeLists.txt文件轉化為make所需要的makefile文件,最后用make命令編譯源碼生成可執行程序或共享庫(so(shared object))。因此CMake的編譯基本就兩個步驟:
- cmake
- make
一般把CMakeLists.txt文件放在工程目錄下,使用時,先創建一個叫build的文件夾(這個並非必須,因為cmake命令指向CMakeLists.txt所在的目錄,例如cmake .. 表示CMakeLists.txt在當前目錄的上一級目錄。cmake后會生成很多編譯的中間文件以及makefile文件,所以一般建議新建一個新的目錄,專門用來編譯),然后執行下列操作:
cd build cmake .. make
其中cmake .. 在build里生成Makefile,make根據生成makefile文件,編譯程序,make應當在有Makefile的目錄下,根據Makefile生成可執行文件。
編寫 CMakeList.txt
# 1. 聲明要求的cmake最低版本 cmake_minimum_required( VERSION 2.8 ) # 2. 添加c++11標准支持 #set( CMAKE_CXX_FLAGS "-std=c++11" ) # 3. 聲明一個cmake工程 PROJECT(rpt_main) MESSAGE(STATUS "Project: SERVER") #打印相關消息消息 # 4. 頭文件 include_directories( ${PROJECT_SOURCE_DIR}/../include/mq ${PROJECT_SOURCE_DIR}/../include/incl ${PROJECT_SOURCE_DIR}/../include/rapidjson ) # 5. 通過設定SRC變量,將源代碼路徑都給SRC,如果有多個,可以直接在后面繼續添加 set(SRC ${PROJECT_SOURCE_DIR}/../include/incl/tfc_base_config_file.cpp ${PROJECT_SOURCE_DIR}/../include/mq/tfc_ipc_sv.cpp ${PROJECT_SOURCE_DIR}/../include/mq/tfc_net_ipc_mq.cpp ${PROJECT_SOURCE_DIR}/../include/mq/tfc_net_open_mq.cpp ${PROJECT_SOURCE_DIR}/local_util.cpp ${PROJECT_SOURCE_DIR}/AgentMemRpt.cpp ${PROJECT_SOURCE_DIR}/AgentDiskRpt.cpp ${PROJECT_SOURCE_DIR}/AgentLoadRpt.cpp ${PROJECT_SOURCE_DIR}/AgentIoRpt.cpp ${PROJECT_SOURCE_DIR}/AgentNetRpt.cpp ${PROJECT_SOURCE_DIR}/AgentCpuRpt.cpp ${PROJECT_SOURCE_DIR}/AgentProcessRpt.cpp ${PROJECT_SOURCE_DIR}/AgentParentRpt.cpp ${PROJECT_SOURCE_DIR}/AgentSysTop_5.cpp ${PROJECT_SOURCE_DIR}/BaseFeatureRptMain.cpp ) # 6. 創建共享庫/靜態庫 # 設置路徑(下面生成共享庫的路徑) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib) # 即生成的共享庫在工程文件夾下的lib文件夾中 set(LIB_NAME rpt_main_lib) # 創建共享庫(把工程內的cpp文件都創建成共享庫文件,方便通過頭文件來調用) # 這時候只需要cpp,不需要有主函數 # ${PROJECT_NAME}是生成的庫名 表示生成的共享庫文件就叫做 lib工程名.so # 也可以專門寫cmakelists來編譯一個沒有主函數的程序來生成共享庫,供其它程序使用 # SHARED為生成動態庫,STATIC為生成靜態庫 add_library(${LIB_NAME} STATIC ${SRC}) # 7. 鏈接庫文件 # 把剛剛生成的${LIB_NAME}庫和所需的其它庫鏈接起來 # 如果需要鏈接其他的動態庫,-l后接去除lib前綴和.so后綴的名稱,以鏈接 # libpthread.so 為例,-lpthread target_link_libraries(${LIB_NAME} pthread dl) # 8. 編譯主函數,生成可執行文件 # 先設置路徑 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin) # 可執行文件生成 add_executable(${PROJECT_NAME} ${SRC}) # 這個可執行文件所需的庫(一般就是剛剛生成的工程的庫咯) target_link_libraries(${PROJECT_NAME} pthread dl ${LIB_NAME})
使用 cmake
- 進入
/home/pzqu/agent/libvirt_base_feature/build
目錄 - 執行命令
cmake ..