cmake知識點總結

  CMake的所有的語句都寫在一個叫 CMakeLists.txt 的文件中。當 CMakeLists.txt 文件確定後,可以用 ccmake 命令對相關的變量值進行配置。這個命令必須指向 CMakeLists.txt 所在的目錄。配置完成之後,應用 cmake 命令生成相應的 makefile。

一、項目的目錄結構

  • src:源文件
  • inc:頭文件
  • test:測試文件,主函數入口
  • proto:proto文件
  • log:項目產生的日誌文件
  • build:在此文件夾中構建項目,不污染源文件
  • bin:生成的可執行文件
  • build.sh:cmake的腳本

二、實例說明Cmake編寫規則

  src文件下的CMakeLists.txt

# 指定CMake編譯最低要求版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

# 將C++文件賦值給變量SRC_LIST_Server
SET(SRC_LIST_Server 
    ChatServer.cpp 
    ChatSystem.pb.cc 
    ChatStatus.pb.cc 
    Mysql.cpp 
    Redis.cpp
)
SET(SRC_LIST_Client 
    ChatClient.cpp 
    ChatSystem.pb.cc 
    ChatStatus.pb.cc 
    Mysql.cpp 
    Redis.cpp
)

# 設置編譯選項
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -lpthread -g -Wall")

# 查找protobuf頭文件
# find_package(Protobuf REQUIRED)
# if(PROTOBUF_FOUND)
#   message(STATUS "protobuf library found")
# else()
#    message(FATAL_ERROR "protobuf library is needed but cant be found")
# endif()
#include_directories(${PROTOBUF_INCLUDE_DIRS})

# 指定頭文件和庫文件目錄
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/inc)
# 指定生成庫文件的目錄
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

INCLUDE_DIRECTORIES(/usr/local/include/google/protobuf)
INCLUDE_DIRECTORIES(/usr/local/boost/include)
INCLUDE_DIRECTORIES(/usr/include/mysql)
INCLUDE_DIRECTORIES(/usr/local/include/hiredis)
INCLUDE_DIRECTORIES(/usr/local/include/glog)

LINK_DIRECTORIES(/usr/local/boost/lib)

# 生成庫文件,默認生成靜態庫,SHARED指定生成庫類型爲動態庫
ADD_LIBRARY(chatserver SHARED ${SRC_LIST_Server})
ADD_LIBRARY(chatclient SHARED ${SRC_LIST_Client})

# 需要鏈接的庫文件
TARGET_LINK_LIBRARIES(chatserver
                      protobuf
                      hiredis
                      mysqlclient
                      glog
)
TARGET_LINK_LIBRARIES(chatclient
                      protobuf
                      hiredis
                      mysqlclient
                      glog
)

  test文件下的CMakeLists.txt

# 指定CMake編譯最低要求版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

# 將Server.cpp賦值給Server變量
SET(Server Server.cpp)
SET(Client Client.cpp)

# 設置編譯選項
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -lpthread -g -Wall")

# 設置生成的執行文件的輸出目錄
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)

INCLUDE_DIRECTORIES(/usr/local/include/google/protobuf)
INCLUDE_DIRECTORIES(/usr/local/boost/include)
INCLUDE_DIRECTORIES(/usr/include/mysql)
INCLUDE_DIRECTORIES(/usr/local/include/hiredis)
INCLUDE_DIRECTORIES(/usr/local/include/glog)
LINK_DIRECTORIES(/usr/local/boost/lib)

# 生成可執行文件server,依賴於Server.cpp
ADD_EXECUTABLE(server ${Server})
ADD_EXECUTABLE(client ${Client})

# 指定server的鏈接庫chatserver和protobuf
TARGET_LINK_LIBRARIES(server chatserver)
TARGET_LINK_LIBRARIES(client chatclient)

【指令說明】:

  • CMAKE_MINIMUM_REQUIRED:聲明Cmake版本,如果低於指定版本則會停止處理工程文件,並報告錯誤。
  • SET:定義變量並賦值。
  • CMAKE_CXX_FLAGS:設置編譯選項。
  • PROJECT_SOURCE_DIR:預定義的變量。
  • ${}:取值。
  • INCLUDE_DIRECTORIES:向工程添加多個特定的頭文件搜索路徑,路徑之間用空格分隔。
  • LINK_DIRECTORIES:添加非標準的共享庫搜索路徑。
  • ADD_LIBRARY:生成動態庫或靜態庫。
  • TARGET_LINK_LIBRARIES:爲TARGET添加需要鏈接的共享庫。
  • ADD_EXECUTABLE:生成可執行文件。

【運行說明】:

#!bin/bash

protoc -I=./proto/ --cpp_out=./proto ./proto/ChatSystem.proto
mv ./proto/ChatSystem.pb.h ./inc/ChatSystem.pb.h
mv ./proto/ChatSystem.pb.cc ./src/ChatSystem.pb.cc

if [ ! -e ./build ]
then 
    mkdir build
else 
    rm -rf build/*
fi

if [ ! -e ./bin ]
then  mkdir bin
else rm -rf bin/*
fi

if [ ! -e ./log ]
then  mkdir log
else rm -rf log/*
fi

if [ ! -e ./lib ]
then  mkdir lib
else rm -rf lib/*
fi

cd build
cmake ..
make

參考:https://github.com/carl-wang-cn/demo/tree/master/cmake
https://www.cnblogs.com/flyinggod/archive/2017/11/08/7805587.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章