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...