[CMake] cmake入門: 調用多個目錄下的源文件

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>包含頭文件。

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