筆記 Modern CMake 3 基本介紹

2021-09-24 05:47:34 字數 2877 閱讀 1339

modern cmake 3:基本介紹

cmake沒有統一的專案結構,一些常用原則可以幫助我們組織更好的專案結構:

- project

- .gitignore

- readme.md

- licence.md

- cmakelists.txt

- cmake

- findsomelib.cmake

- include

- project

- lib.hpp

- src

- cmakelists.txt

- project

- cmakelists.txt

- lib.cpp

- cmakelists.txt

- tests

- testlib.cpp

- docs

- doxyfile.in

- extern

- googletest

- scripts

- helper.py

原始檔中都應包含cmakelists.txt檔案。可以使用add_subdirectory新增包含cmakelists.txt檔案的子目錄到工程。

大多時候,我們需要cmake資料夾,所有find*.cmake檔案都應在此資料夾中找到。把cmake資料夾新增到cmake path的方法:

set(cmake_moudle_path "$/cmake" $)
如果你想使build目錄在source目錄之外,新增以下**在你的cmakelists.txt檔案的頂部:

### require out-of-source builds

file(to_cmake_path "$project_binary_dir/cmakelists.txt" loc_path)

if(exists $)

message(fatal_error "you cannot build in a source directory (or any directory with a cmakelists.txt file). please make a build subdirectory. feel free to remove cmakecache.txt and cmakefiles.")

endif()

cmake在configure階段執行命令相當的容易。使用execute_process執行程序並能得到結果。還可以使用$,find_packaage(git,或者find_program執行命令。使用result_variable檢測返回值,output_variable可以得到輸出結果。

舉乙個更新git子模組的例子:

find_package(git quiet)

if(git_found and exists "$/.git")

execute_process(command $ submodule update --init --recursive

working_directory $

result_variable git_submod_result)

if(not git_submod_result equal "0")

message(fatal_error "git submodule update --init failed with $, please checkout submoudles")

endif()

endif()

在build階段執行命令需要一些技巧。我們需要考慮什麼時候需要執行命令?以及命令的輸出是否為另外target的輸入?以下是乙個調研python指令碼生成標頭檔案的例子:

find_package(pythoninterp required)

add_custom_command(output "$/include/generated.hpp"

command "$/scripts/generateheader.py" --argument

depends some_target)

add_custom_target(generate_header all

depends "$/include/generated.hpp")

install(files $/include/generated.hpp destination include)

# 所有的cmake files都是由此開始的。在新版本cmake中,給定最低版本號建議使用rang方式。

cmake_minimun_required(version 3.1...3.14)

# 專案宣告。你應該表明專案使用的語言和版本,這都是非常有價值的資訊

project(moderncmakeexample version 1.0 languages cxx)

# 設定變數(尤其是c++語言,本例沒有變數宣告)

# find packages

add_library(mylibexample ******_lib.cpp ******_lib.h)

# 應用程式,輸出名稱和target保持一致

add_executable(myexample ******_example.cpp)

# 鏈結target

target_link_library(myexample private mylibexample)

線性基學習筆記

線性基是幹嘛的呢?給定n個數,求所有數的異或和最大是多少?求解這類問題的時候,就需要線性基了 個人感覺線性基本身就一種貪心。首先定義ba se i bas e i 表示最高位1在i位的數是什麼 對於新進來的數tm p tmp 我們先找出他最高位上的1,假設為第 j j 位,然後看一下ba se j ...

線性基 學習筆記

includeusing namespace std using ll long long const int maxn 5e5 5 原來的數 const int maxbit 63 ll a maxn 原來的數 ll p maxbit p j 第j位為最高位1的數 最高位1在第j位的數 int m...

線性基 學習筆記

按位計算,如果相同記為0,不同記為1。如果,a b c,c b a 交換律結合律 對於任何數,x x 0,x 0 x 對 於一 段序列a n,異或 和為a1 a2 an 對於一段序列a n,異或和為a 1 a 2 a n 對於一段序列 an 異或和為 a1 a2 an 設t s,所有 這樣的子 集t...