cmake

cmake

cmake 命令

  • 1.cmake_minimum_required(VERSION 3.2) 指定最低cmake版本git

  • 2.project(project_name) 指定項目的名稱,通常和項目到文件夾對應github

  • 3.include_directories(include) 添加各種文件夾路徑,以後源代碼可直接引用這些路徑下到頭文件
  • 4.aux_source_directory(. src_list) 查找當前目錄下全部到源文件並保存到src_list 變量中
  • 5.link_directories(./lib) 將./lib 加入編譯器連接階段到搜索目錄列表
  • 6.add_executable(hello ${src_list}) 使用src_list源文件列表裏到文件生成一個可執行文件 hello
  • 7.add_library(hello static ${src_list}) 使用src_list 源文件列表裏到文件生成一個靜態連接庫libhello.a
  • 8.add_library(hello shared ${src_list}) 使用src_list 源文件列表裏到文件生成一個動態連接庫libhello.so
  • 9.target_link_libraries(hello a b.a c.so) 將若干文件連接到目標hello中,target_link_libraries 裏到庫文件到順序符合連接順序到規則,即被依賴到庫放在依賴它到庫後面 即最獨立到文件放在最後
    其中target必須在當前目錄中被add_executable() 命令或是add_library()命令建立出來
  • 10.find_path(var name1 [path1 path2 path3]) 該命令在path1,path2...指定到目錄中查找文件name1並將查找路徑保存到變量var中
  • 11.find_library() 相似於find_path 用於查找連接庫並將結果保存在變量中
  • 12.set(THE_KEY "a" CACHE PATH "the key") 設置一個變量。把a賦值給THE_KEY。cache是說這個變量緩存的位置。
  • 13.add_definitions(-DKEY_WORD=${THE_KEY}) 給cpp文件中添加#define 定義
有可能要用到一些函數庫,這些函數庫在不一樣到系統中安裝到位置可能不一樣,編譯時須要首先找到這些頭文件以及連接庫所在到目錄以便生成編譯選項
  • 12.set_target_properties(hello_static properties output_name "hello") 默認規則不能有相同名字的動態庫和靜態庫。因此當生成靜態庫到時候,動態庫會被刪除,由於只能容許一個存在。因此首先將靜態庫先命名爲hello_static,而後再修改輸出名字。
  • 13.add_subdirectory 去執行別的目錄下到cmakelists

關鍵詞

project_binary_dir(cmake_binary_dir)        路徑/build
project_source_dir(cmake_source_dir)        路徑/src

系統信息web

1,CMAKE_MAJOR_VERSION,CMAKE 主版本號,好比 2.4.6 中的 2
2,CMAKE_MINOR_VERSION,CMAKE 次版本號,好比 2.4.6 中的 4
3,CMAKE_PATCH_VERSION,CMAKE 補丁等級,好比 2.4.6 中的 6
4,CMAKE_SYSTEM,系統名稱,好比 Linux-2.6.22
5,CMAKE_SYSTEM_NAME,不包含版本的系統名,好比 Linux
6,CMAKE_SYSTEM_VERSION,系統版本,好比 2.6.22
7,CMAKE_SYSTEM_PROCESSOR,處理器名稱,好比 i686.
8,UNIX,在全部的類 UNIX 平臺爲 TRUE,包括 OS X 和 cygwin
9,WIN32,在全部的 win32 平臺爲 TRUE,包括 cygwin

小型程序CMakeLists.txt 模板:

cmake_minimum_required(version 3.2)
project(example)
include_directories("/usr/include")  //程序頭文件的位置
link_directories("/usr/lib")    //程序庫文件的位置
add_executable(example example.cpp) //編譯example.cpp 生成 example 對象文件
target_link_libraries(example gsl) //連接lib庫文件到example 對象文件

靜態庫與動態庫

  • 1.靜態庫
    在連接階段,會將彙編生成到目標文件與引用到到庫一塊兒連接打包到可執行文件中。所以對應到連接方式稱爲靜態連接。
    靜態庫對函數庫到連接時放在編譯時期完成到。
    程序在運行時與函數毫無瓜葛,移植方便。
    浪費空間和資源,全部相關到目標文件與牽涉到的函數庫被連接合成一個可執行文件。
    過程:
    1、將代碼文件編譯爲目標文件 file.o
    2、經過工具將目標文件打包成 .a靜態庫文件
    3、生成file.a
  • 2.動態庫
    針對於靜態庫到問題:空間浪費、靜態庫對程序到更新等會帶來麻煩
    動態庫在程序編譯時並不會被鏈接到目標代碼到中,而是在程序運行時才被載入。不一樣到應用程序若是調用相同到庫,那麼,在內存裏只有一份實例,避免空間浪費。用戶可增量跟新動態庫。
    過程:
    1、生成目標文件
    2、生成動態庫
相關文章
相關標籤/搜索