日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

CMakeLists.txt学习记录

發布時間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CMakeLists.txt学习记录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Cmake 學習地址與作用

cmake詳細見:https://gitlab.kitware.com/cmake/community/-/wikis/home

是一個跨平臺、開源的構建系統。它是一個集軟件構建、測試、打包于一身的軟件。它使用與平臺和編譯器獨立的配置文件來對軟件編譯過程進行控制。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

二、常用命令?

# 聲明要求的 cmake 最低版本
cmake_minimum_required( VERSION 2.8 )# 聲明一個 cmake 工程
project( HelloSLAM )# 設置編譯模式
set( CMAKE_BUILD_TYPE "Debug" )# 添加一個可執行程序
# 語法:add_executable( 程序名 源代碼文件 )
add_executable( helloSLAM helloSLAM.cpp )# 添加一個庫
add_library( hello libHelloSLAM.cpp )
# 共享庫
add_library( hello_shared SHARED libHelloSLAM.cpp )add_executable( useHello useHello.cpp )
# 將庫文件鏈接到可執行程序上
target_link_libraries( useHello hello_shared )

*1.指定 cmake 的最小版本 :

命令可選,可以不寫,版本向后兼容。但如果所安裝CMakeLists.txt 文件中使用了一些高版本 cmake 特有的一些命令的時候,就必須加這一行,提醒用戶升級到該版本之后再執行 cmake。

cmake_minimum_required(VERSION 2.8)

?*2. 設置項目名稱:

這里就是“helloworld”,這個命令不是強制性的,但最好都加上。它會引入兩個變量 demo_BINARY_DIR 和 demo_SOURCE_DIR,同時,cmake 自動定義了兩個等價的變量 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR。?

project(helloworld)

?*3. 設置編譯類型

add_library 默認生成是靜態庫,通過以上命令生成文件名字,

  • 在 Linux 下是:
    demo
    libcommon.a
    libcommon.so
  • 在 Windows 下是:
    demo.exe
    common.lib
    common.dll
add_executable(helloworld helloworld.cpp) # 生成可執行文件
add_library(common STATIC util.cpp) # 生成靜態庫
add_library(common SHARED util.cpp) # 生成動態庫或共享庫

?4. 指定編譯包含的源文件

*4.1 明確指定包含哪些源文件?

add_library(helloworld helloworld .cpp test.cpp util.cpp)

4.2 搜索所有的 cpp 文件

?aux_source_directory(dir VAR) 發現一個目錄下所有的源代碼文件并將列表存儲在一個變量中。

aux_source_directory(. SRC_LIST) # 搜索當前目錄下的所有.cpp文件
add_library(demo ${SRC_LIST})

?4.3 自定義搜索規則

file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
add_library(helloworld ${SRC_LIST})
# 或者
file(GLOB SRC_LIST "*.cpp")
file(GLOB SRC_PROTOCOL_LIST "protocol/*.cpp")
add_library(helloworld ${SRC_LIST} ${SRC_PROTOCOL_LIST})
# 或者
aux_source_directory(. SRC_LIST)
aux_source_directory(protocol SRC_PROTOCOL_LIST)
add_library(helloworld ${SRC_LIST} ${SRC_PROTOCOL_LIST})

5. 查找指定的庫文件

find_library(VAR name path)查找到指定的預編譯庫,并將它的路徑存儲在變量中。
默認的搜索路徑為 cmake 包含的系統庫,因此如果是 NDK 的公共庫只需要指定庫的 name 即可。

cmake_minimum_required( VERSION 2.8 )
project( visualizeGeometry )set(CMAKE_CXX_FLAGS "-std=c++11")# 添加Eigen頭文件
include_directories( "/usr/include/eigen3" )# 添加Pangolin依賴
find_package( Pangolin )
include_directories( ${Pangolin_INCLUDE_DIRS} )add_executable( visualizeGeometry visualizeGeometry.cpp )
target_link_libraries( visualizeGeometry ${Pangolin_LIBRARIES} )

類似的命令還有 find_file()、find_path()、find_program()、find_package()。

??6. 設置包含的目錄

#example
include_directories( ${Pangolin_INCLUDE_DIRS} )include_directories(${CMAKE_CURRENT_SOURCE_DIR}${CMAKE_CURRENT_BINARY_DIR}${CMAKE_CURRENT_SOURCE_DIR}/include
)

7. 設置鏈接庫搜索目錄

link_directories(${CMAKE_CURRENT_SOURCE_DIR}/libs
)

Linux 下還可以通過如下方式設置包含的目錄?

?
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}")

8. 設置 target 需要鏈接的庫

target_link_libraries( # 目標庫demo# 目標庫需要鏈接的庫# log-lib 是上面 find_library 指定的變量名${log-lib} )

?在 Windows 下,系統會根據鏈接庫目錄,搜索xxx.lib 文件,Linux 下會搜索 xxx.so 或者 xxx.a 文件,如果都存在會優先鏈接動態庫(so 后綴)。

8.1 指定鏈接動態庫或靜態庫

target_link_libraries(demo libface.a) # 鏈接libface.a
target_link_libraries(demo libface.so) # 鏈接libface.so

8.2 指定全路徑

target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.a)
target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.so)

?8.3 指定鏈接多個庫

target_link_libraries(demo${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.aboost_system.aboost_threadpthread)

9. 設置變量

9.1 set 直接設置變量的值

set(SRC_LIST main.cpp test.cpp)
add_executable(demo ${SRC_LIST})

9.2 set 追加設置變量的值

set(SRC_LIST main.cpp)
set(SRC_LIST ${SRC_LIST} test.cpp)
add_executable(demo ${SRC_LIST})

9.3 list 追加或者刪除變量的值

set(SRC_LIST main.cpp)
list(APPEND SRC_LIST test.cpp)
list(REMOVE_ITEM SRC_LIST main.cpp)
add_executable(demo ${SRC_LIST})

10. 自定義編譯選項

cmake 允許為項目增加編譯選項,從而可以根據用戶的環境和需求選擇最合適的編譯方案。
例如,可以將 MathFunctions 庫設為一個可選的庫,如果該選項為 ON ,就使用該庫定義的數學函數來進行運算,否則就調用標準庫中的數學函數庫。

修改根目錄下的 CMakeLists.txt 文件如下:

# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)
# 項目信息
project (Demo)
# 加入一個配置頭文件,用于處理 CMake 對源碼的設置
configure_file ("${PROJECT_SOURCE_DIR}/config.h.in""${PROJECT_BINARY_DIR}/config.h")
# 是否使用自己的 MathFunctions 庫
option (USE_MYMATH"Use provided math implementation" ON)
# 是否加入 MathFunctions 庫
if (USE_MYMATH)include_directories ("${PROJECT_SOURCE_DIR}/math")add_subdirectory (math)set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)
# 查找當前目錄下的所有源文件
# 并將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)
# 指定生成目標
add_executable(Demo ${DIR_SRCS})
target_link_libraries (Demo ${EXTRA_LIBS})

configure_file 命令用于加入一個配置頭文件 config.h ,這個文件由 cmake 從 config.h.in 生成,通過這樣的機制,將可以通過預定義一些參數和變量來控制代碼的生成。
option 命令添加了一個 USE_MYMATH 選項,并且默認值為 ON 。根據 USE_MYMATH 變量的值來決定是否使用我們自己編寫的 MathFunctions 庫。
?

總結

以上是生活随笔為你收集整理的CMakeLists.txt学习记录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。