CMake入門
舉例一:
假設工程HelloWorld文件結構如下:
-main.cpp
-MyClass/
–MyClass.h
–MyClass.cpp
在main.cpp中include<MyClass.h>
方法一 在根目錄下的CMakeLists.txt內容爲:
cmake_minimum_required(VERSION 3.12)
project(HelloWorld)
set(CMAKE_CXX_STANDARD 14)
# 包含進目錄 MyClass/
include_directories("${PROJECT_SOURCE_DIR}"/MyClass)
# 使用指定文件生成可執行文件 HelloWorld
add_executable(HelloWorld main.cpp MyClass/MyClass.h MyClass.cpp)
該方法爲直接使用全部的資源文件生層可執行文件
方法二 在根目錄下的CMakeLists.txt爲:
cmake_minimum_required(VERSION 3.15)
project(HelloWorld)
set(CMAKE_CXX_STANDARD 14)
# 蒐集指定目錄 . 和./MyClass 下的源文件,將輸出結果列表儲存到變量ALL_SOURCE中
aux_source_directory(. ALL_SOURCE)
aux_source_directory(${PROJECT_SOURCE_DIR}/MyClass ALL_SOURCE)
# 包含進目錄 MyClass/
include_directories("${PROJECT_SOURCE_DIR}/MyClass")
# 使用指定文件生成可執行文件 HelloWorld
add_executable(HelloWorld ${ALL_SOURCE})
該方法同爲直接使用全部的資源文件,但是這次使用aux_source_directory()命令自動收集參數目錄下的全部源文件到變量中,在這個例子中看起來似乎比方法一複雜,但是對於目錄下有很多源文件的情況比方法一簡單。
方法三 在MyClass/和根目錄下分別建立CMakeLists.txt文件:
根目錄下的CMakeLists.txt爲:
cmake_minimum_required(VERSION 3.15)
project(HelloWorld)
set(CMAKE_CXX_STANDARD 14)
# 添加子目錄 MyClass/ 並且也會處理 MyClass目錄下的 CMakeLists.txt文件
add_subdirectory(MyClass)
# 包含進目錄 MyClass/
include_directories("${PROJECT_SOURCE_DIR}/MyClass")
# 生成可執行文件 HelloWorld
add_executable(HelloWorld main.cpp)
# 將可執行文件添加鏈接庫 MyClass
target_link_libraries(HelloWorld MyClass)
MyClass/目錄下CMakeLists.txt爲:
cmake_minimum_required(VERSION 3.15)
set(CMAKE_CXX_STANDARD 14)
#蒐集MyClass目錄下的文件
aux_source_directory(. MYCLASS_SOURCE)
#生成鏈接庫
add_library(MyClass ${MYCLASS_SOURCE})
該方法將MyClass目錄下的源文件生成一個靜態鏈接庫,在生成可執行文件之後將可執行文件與鏈接庫文件鏈接起來運行。比方法一、二更合理(我覺得)。
舉例二:
假設工程HelloWorld文件結構如下:
-main.cpp
-MyClass/
–MyClass.h
–MyClass.cpp
-MyFunction/
–MyFunction.h
–MyFunction.cpp
在main.cpp中 #include<MyFunction.h>
在MyFunction.cpp中 #include<MyClass.h>
方法一 在根目錄下、MyClass目錄和MyFunction目錄下都新建CMakeLists.txt文件
根目錄下CMakeLists.txt爲:
cmake_minimum_required(VERSION 3.15)
project(HelloWorld)
set(CMAKE_CXX_STANDARD 14)
#添加子目錄 MyClass/ 並且也會處理 MyClass目錄下的 CMakeLists.txt文件
add_subdirectory(MyClass)
add_subdirectory(MyFunction)
#生成可執行文件 HelloWorld
add_executable(HelloWorld main.cpp)
#將可執行文件添加鏈接庫MyFunction
target_link_libraries(HelloWorld MyFunction)
#將目錄MyFunction添加到HelloWorld目標路徑中
target_include_directories(HelloWorld PUBLIC MyFunction)
在MyClass目錄下的CMakeLists.txt文件爲:
cmake_minimum_required(VERSION 3.15)
set(CMAKE_CXX_STANDARD 14)
#蒐集MyClass目錄下的文件
aux_source_directory(. MYCLASS_SOURCE)
#生成鏈接庫
add_library(MyClass ${MYCLASS_SOURCE})
在MyFunction目錄下的CMakeLists.txt文件爲:
cmake_minimum_required(VERSION 3.12)
set(CMAKE_CXX_STANDARD 14)
#生成鏈接庫
add_library(MyFunction MyFunction.h MyFunction.cpp)
#目標鏈接庫MyFunction添加鏈接庫MyClass
target_link_libraries(MyFunction MyClass)
#將目錄MyClass添加的目標目錄中
target_include_directories(MyFunction PUBLIC ../MyClass)
同時另外提一點,根目錄下的CMakeLists.txt文件中的命令include_directories()是用來將目錄MyClass/添加到編譯器搜索包含文件的路徑列表中,這樣在main.cpp文件中可以使用#include<MyClass.h>。如果沒有include_directoris()命令,必須在main.c中使用#include<MyClass/MyClass.h>包含頭文件。