CMake基礎-CMakeLists.txt編寫指南

寫在前面

其實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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章