寫在前面
其實CMake在C++編譯中是常用的編譯工具,簡單易上手,學習成不較低,最近我們也在開始用CMake編譯,寫一點最近項目中學習的一點體會和知識點,作以記錄,網上單層級的CMake的例子挺多的,畢竟最終都是用一個CMakeLists.txt進行編譯的,這個放在後面寫,這個帖子主要寫下多層級CMake的使用方法及目錄關係:
多層目錄舉例
工程結構大致分爲三層:從編譯的易操作性來講,編譯的的位置應在CMakePro目錄下進行,層層包含直到編譯完全部源文件,因此,CMakeLists.txt的分佈爲:
CMakePro/CMakeLists.txt
CMakePro/Makefile
CMakePro/include/CMakeLists.txt
CMakePro/common/CMakeLists.txt
CMakePro/src/CMakeLists.txt
CMakePro/third/CMakeLists.txt
CMakePro/other/CMakeLists.txt
CMakePro/other/other1/CMakeLists.txt
CMakePro/other/other2/CMakeLists.txt
關鍵文件舉例
CMakePro/Makefile
編譯一般不會放着當前位置進行,一般會創建一個build目錄,將編譯操作移至build目錄完成:
MAKE_PATH = $(shell pwd)
CPU_NUM = $(grep -c ^processor /proc/cpuinfo)
BUILD_DIR = ./build
all: build
cd $(BUILD_DIR); make -j$(CPU_NUM)
build:
mkdir -p $(BUILD_DIR); cd $(BUILD_DIR); cmake ..
clean:
rm -rf $(BUILD_DIR)
- make -j$(CPU_NUM) 這個語句是獲得CPU個數,並行編譯
CMakePro/CMakeLists.txt
最外層的這個CMakeLists.txt主要是導航左右,將同級的目錄全部包含進去:
#Minimum Version of CMake
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
# project name
PROJECT(CMakePro)
ADD_SUBDIRECTORY(include) #include可能都是頭文件,這個根據自己的情況判斷是否添加
ADD_SUBDIRECTORY(common)
ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(third)
ADD_SUBDIRECTORY(other)
#設置編譯類型 Debug Release
SET(CMAKE_BUILD_TYPE Debug)
#SET(CMAKE_BUILD_TYPE Release)
基本外層的CMakeLists.txt就是這個樣了,注意各個目錄生成的庫的依賴關係,other裏面可以參考這個!
CMakePro/src/CMakeLists.txt
這個是最後一層的CMakeLists.txt:
cmake_minimum_required(VERSION 3.11)
AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src MAIN_SRCS)
#頭文件的路徑
INCLUDE_DIRECTORIES(
"${PROJECT_SOURCE_DIR}/include/"
)
#依賴庫的地址
LINK_DIRECTORIES(
"/lib64"
"/lib"
)
#生成可執行程序
add_executable(main_exec ${MAIN_SRCS})
#目標鏈接的動態庫、靜態庫等
target_link_libraries()
#設置生成的可執行文件的輸出路徑
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
其他用過的幾個語句:
#生成靜態庫
ADD_LIBRARY(test_static STATIC ${MAIN_SRCS})
#生成動態庫
ADD_LIBRARY(test_dyna SHARED ${MAIN_SRCS})
靜態庫的鏈接舉例
第一部分,生成靜態庫:
cmake_minimum_required(VERSION 3.11)
AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/externel/ EXTERNEL_SRCS)
INCLUDE_DIRECTORIES(
"${PROJECT_SOURCE_DIR}/externel/"
)
SET(SRC ${EXTERNEL_SRCS})
SET(LIBRARY_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib")
ADD_LIBRARY(externaltest_static STATIC ${SRC})
SET_TARGET_PROPERTIES(externaltest_static PROPERTIES OUTPUT_NAME "externaltest")
SET_TARGET_PROPERTIES(externaltest_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
第二部分,引用靜態庫:
cmake_minimum_required(VERSION 3.11)
INCLUDE_DIRECTORIES(
"${PROJECT_SOURCE_DIR}/externel/"
)
LINK_DIRECTORIES(
"${PROJECT_SOURCE_DIR}/lib"
)
ADD_EXECUTABLE(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} libexternaltest.a)
SET( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)