贡献者: addis
ccmake 可以有 TUI.否则就用 cmake
CMakeLists.txt 的路径下,cmake . 生成 Makefile,然后 make -j12 多线程编译.make VERBOSE=1 -j12 输出编译命令.cmake 会在当前目录生成 Makefile 和一些临时文件和文件夹,清理麻烦,所以还是建议输出到子文件夹.
cmake -S CMakeList的目录 -B 生成Makefile的目录,然后再到 Makefile 的目录 make -j12 即可.如果要清理 cmake 生成的文件以及所有编译出来的文件,直接把第二个目录清空即可.
make,所以也可以用 cmake --build 生成Makefile的目录 [--target 可执行文件] -- -j 12 其中 -- 后面的选项会传给 make 或者别的具体用于编译的程序.
command(arg1 arg2 ...) 其中 command 不区分大小写,arg 用空格隔开,如果 arg 本身有空格,用双引号即可
message(STATUS "...") 可以输出到 stdout.如果 message(STATUS ${var}) 中的变量是 list,那么中间不会有空格,应该用 message(STATUS "${var}"),输出中每个变量会用分号隔开.
arg 之间可以换行
${VAR}
set 可以对变量赋值,例如 set(var, 1)
set 也可以把许多变量变成一个 list,如 set(Foo a b c) 将 Foo 变成包含 a b c 的 list,当 ${Foo} 被使用时相当于 a b c,例如 command(Foo) 相当于 command(a b c).另外 command("${Foo}") 相当于 command("a b c")(双引号中的是一个变量)
$EVN{VAR}.注意 cmake 看到的环境变量未必和 bash 中的相同,可以用 cmake -E environment 检查.例子:message(STATUS $ENV{PWD})
cmake_minimum_required(VERSION x.x)
set(CMAKE_CXX_COMPILER "/usr/bin/g++") 设置 compiler
set(CMAKE_CXX_FLAGS "-std=c++11") 设置 flag,包括 c++ 标准.
set(CMAKE_CXX_STANDARD 11) 会对 g++ 自动使用 -std=gnu11 而不是 -std=c++11,一些情况会出错.
cmake -DCMAKE_BUILD_TYPE=Debug 用 debug 模式编译
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=address")
project(project_name) 指定项目名称
set(var str1 [str2] ...) 对变量赋值(若有多个值就生成 list)
list(APPEND var str1 [str2] ...) 在变量(list)后面添加元素
list(REMOVE_ITEM var str1 ...) 从 var 的 list 中移除(如果不存在也不报错)
set(var "${var} str1 str2") 等效于上一条
file(GLOB var "folder/*.cpp" "fname2.cpp") 可以列出所有 "folder/*.txt" 文件,以及 fname2.cpp(如果存在)赋值给 var.注意文件名包括绝对路径.
add_definitions(-D FOO -D BAR) 给编译器添加宏定义
add_compile_options(-Wall -fopenmp) 给编译器添加选项(注意不能用 -D)
add_executable(exe_name source_name) 前者是执行文件名,后者是所有需要 link 的 cpp 文件名,不需要头文件.cmake 会自动分析代码得到哪个 cpp 调用哪个头文件,如果头文件改变了,只有调用它的 cpp 会重新编译.
configure_file(file_in file_out) 将文件中 @var@ 替换为变量 var 的值
include_directories(dir1 [dir2] ...) 添加头文件的搜索路径
add_library(exe_name source_name) 单独编译一个 library(在 library 路径的 CMakeLists 中使用这个而不是 add_executable)
link_directories(路径) 相当于编译器的 -L 选项,添加静态或动态 library 的搜索路径.
set(CMAKE_INSTALL_RPATH 路径) 相当于设置 rpath
add_subdirectory(dir1 [dir2] ...) 执行子目录中的 CMakeLists
target_link_libraries(exe_name lib1 [lib2] ...) link 阶段链接 library,相当于 -l lib1 -l lib2
option(opt_name description default) 定义一个 option 开关(会在 gui 中显示开关)以及默认值.opt_name 可以在 CMakeLists 中的 if 语句中使用例如 if(opt_name) ... endif(opt_name).default 可以是 ON 或 OFF
opt_name 为 ON 时 #cmakedefine opt_name 会被替换为 #define opt_name
target_precompile_headers(可执行文件 PRIVATE foo.h bar.h) 可以编译头文件,注意貌似不会自动包括 .h 包括的文件.如果头文件(或者依赖的文件)改了,那么将会自动重新编译头文件.
PROJECT_SOURCE_DIR 是源文件的根目录,就是传给 ccmake 的目录
PROJECT_BINARY_DIR 是 Cmake 的输出目录,临时文件,Makefile 等都在这个目录.这就是运行 ccmake 的目录
参考这里.
if(<condition> AND (<condition> OR <condition>))
<commands>
elseif(("bar" IN_LIST var) OR (file1 IS_NEWER_THAN file2))
<commands>
elseif (var)
当 var 不是 false constant
elseif(DEFINED <name>|CACHE{<name>}|ENV{<name>})
若定义了变量
else()
<commands>
endif()
*.lib,只需要在 add_executable() 命令前面插入(必须在之前)abc.lib 的路径 link_directories(path/to/lib) 然后再 add_executable() 之后插入 target_link_libraries(exe_name abs) 即可
if(MSVC)...end(MSVC) 可以专门给 Visual Studio 执行一些命令
ZERO_CHECK 会重新运行/更新 CMakeLists.txt,ALL_BUILD 会编译所有工程.如果看着不爽的话也可以把这两个 project 删掉.如果直接 run without debug 的话,会提示 ALL_BUILD 不能 run,所以要 run 只能右键某个 project 然后 run(所以还是把两个多余的 project 删掉好些).
sudo apt install cmake-curses-gui 安装
ccmake,这个目录可以是源文件目录
ccmake ../
h 帮助,q 退出,c configure,G 生成 Makefile
 
 
 
 
 
 
 
 
 
 
 
友情链接: 超理论坛 | ©小时科技 保留一切权利