cmake常用命令学习[已迁移]

1.include

https://blog.csdn.net/qq_38410730/article/details/102677143

CmakeLists.txt才是cmake的正统文件,而.cmake文件是一个模块文件,可以被includeCMakeLists.txt中。

include指令一般用于语句的复用,也就是说,如果有一些语句需要在很多CMakeLists.txt文件中使用,为避免重复编写,可以将其写在.cmake文件中,然后在需要的CMakeLists.txt文件中进行include操作就行了。

include(file|module)

.cmake文件里包含了一些cmake命令和一些宏/函数,当CMakeLists.txt包含该.cmake文件时,当编译运行时,该.cmake里的一些命令就会在该包含处得到执行,并且在包含以后的地方能够调用该.cmake里的一些宏和函数。

之后有机会再了解什么事宏和函数。

2.protobuf_generate_cpp

protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS foo.proto)

将foo.proto文件生成源码,使用PROTO_SRC,PROTO_HARS变量分别指代生成的cpp和h文件并可用于连接到target和设置include。

要求protobuf_generate_cpp命令和生成add_executable() 或 add_library() 的命令必须在同一个CMakeList中.

 3.file命令

https://www.cnblogs.com/fnlingnzb-learner/p/7221648.html

file(GLOB variable [RELATIVE path] [gl  obbingexpressions]...)

 GLOB 会产生一个由所有匹配globbing表达式的文件组成的列表,并将其保存到变量中。(relative path这个好像不常用?可以忽略。如果指定了RELATIVE 标记,返回的结果将是与指定的路径相对的路径构成的列表。)

如果没有写正则表达式,那么什么文件都匹配不到。例子:

file(GLOB files  *)
foreach(file IN LISTS files)
    message(STATUS ${file})
endforeach(file)

这段代码的意思是挑选出当前文件下的所有文件,然后打印。

  • file(MAKE_DIRECTORY [directory1 directory2 ...])

MAKE_DIRECTORY在指定目录处创建子目录,如果它们的父目录不存在,也会创建它们的父目录。

 

5.add_subdirectory

https://www.jianshu.com/p/07acea4e86a3,添加一个子目录并构建该子目录。

add_subdirectory (source_dir [binary_dir] [EXCLUDE_FROM_ALL])# 绝对路径或当前目录的相对路径 []是可选参数

binary_dir,指定文件输出存放路径。

 

6.自带变量

https://blog.csdn.net/wzj_110/article/details/116674655, https://juejin.cn/post/6844903999448055815

内置变量

CMAKE_CURRENT_LIST_DIR: 当前处理的'cmake或CMakeListst.txt文件'所在的目录

CMAKE_CURRENT_SOURCE_DIR:指的是当前处理的 CMakeLists.txt 所在的路径。 

PROJECT_SOURCE_DIR:项目源文件的目录,如果直接在代码目录下cmake,那么此变量与PROJECT_BINARY_DIR内容相同;

PROJECT_BINARY_DIR:可执行文件的目录。

7.function用法

https://blog.csdn.net/qq_38410730/article/details/102677143

function(<name> [arg1 [arg2 [arg3 ...]]])
  COMMAND1(ARGS ...)            # 命令语句
  COMMAND2(ARGS ...)
  ...
function()

 可以用${arg1}来引用变量。当宏和函数调用的时候,如果传递的是经set设置的变量,必须通过${}取出内容。

function(Foo arg)
  set(${arg} "abc" PARENT_SCOPE)
  message("# After change the value of arg.")
  message("arg = ${arg}")
endfunction()
message("=== Call function ===")
Foo(test)

message("test value = ${test}")


//CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
include(test.cmake)

 打印结果

=== Call function ===
# After change the value of arg.
arg = test  //不太明白这里为什么是test值?
test value = abc

 总之在CMakeLists访问变量就带上${}。

8.add_library() 

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [source1] [source2 ...])
  • 添加名为name的库,name全局唯一;
  • 库的类型是STATIC(静态库)/SHARED(动态库)/MODULE(模块库)之一,生成的library名会根据STATICSHARED成为name.aname.lib;默认是STATIC选项。

9.INCLUDE_DIRECTORIES()

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 …]) //默认是AFTER

将指定目录添加到编译器的头文件搜索路径之下。相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用.

使用SYSTEM选项,会把指定目录当成系统的搜索目录。

10.get_filename_component

https://blog.csdn.net/wzj_110/article/details/116431616

cmake获取'文件名'的'特定'部分。

 路径+文件名。

11.add_executable

https://blog.csdn.net/MacKendy/article/details/122549819

基于特定的源文件,创建可执行文件,名为<name>或者<name>.exe(根据平台不同,带exe后缀的是win平台)。

 创建名为<name>的target,这个target在make的时候会编译为可执行文件。编译的源文件为[source1] [source2]…。

https://www.cnblogs.com/dbai/p/17209898.html,add_executable的3种写法,一种是最基础麻烦的,第二是用file命令,第三种是aux但头文件要单独加。

12.aux_source_directory

//语法:
aux_source_directory(<dir> <variable>)

//例子:
//# 查找目录下的所有源文件
//# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

 

posted @ 2022-08-07 22:34  lypbendlf  阅读(189)  评论(0编辑  收藏  举报