CMake常用命令大全:提高项目构建效率

CMake是一个跨平台、开源的构建工具,它可以自动生成Makefile或者Visual Studio等IDE的工程文件。它能够帮助开发者更方便地管理项目的构建过程,提高项目构建的效率。在本文中,我们将介绍CMake常用的命令以及对应的用法


add_executable

add_executable命令用于将多个源文件编译成可执行文件。举个例子,假设我们有两个源文件main.cpphelper.cpp,它们需要被编译成一个可执行文件myapp,我们可以使用下面的代码:

add_executable(myapp main.cpp helper.cpp)

其中,myapp表示生成的可执行文件的名称,main.cpphelper.cpp表示源代码文件的名称。如果有多个源代码文件,可以将它们作为参数逐一列出。


add_library

add_library命令用于将多个源文件编译成静态库或动态库。举个例子,假设我们有两个源文件foo.cppbar.cpp,它们需要被编译成一个静态库libfoobar.a,我们可以使用下面的代码:

add_library(foobar STATIC foo.cpp bar.cpp)

其中,foobar表示生成的库的名称,foo.cppbar.cpp表示源代码文件的名称。STATIC表示生成静态库,SHARED表示生成动态库,MODULE表示生成插件库。如果不指定库类型,则默认生成静态库。


target_link_libraries

target_link_libraries命令用于将一个或多个库链接到可执行文件或其他库中。举个例子,假设我们需要将libfoo.alibbar.a链接到可执行文件myapp中,我们可以使用下面的代码:

target_link_libraries(myapp foo bar) 

其中,myapp表示可执行文件或其他库的名称,foobar表示需要链接的库的名称。如果有多个库,可以将它们作为参数逐一列出。


include_directories

include_directories命令用于将头文件路径添加到编译器的搜索路径中。举个例子,假设我们需要将/path/to/include添加到编译器的头文件搜索路径中,我们可以使用下面的代码:

include_directories(/path/to/include)

如果有多个路径,可以将它们作为参数逐一列出。另外,AFTERBEFORE表示添加的路径在搜索路径中的位置,SYSTEM表示添加的路径是系统头文件路径。


link_directories

link_directories命令用于将库文件路径添加到链接器的搜索路径中。举个例子,假设我们需要将/path/to/lib添加到链接器的库文件搜索路径中,我们可以使用下面的代码:

link_directories(/path/to/lib)

如果有多个路径,可以将它们作为参数逐一列出。


set

set命令用于设置变量的值。举个例子,假设我们需要将变量MY_VARIABLE的值设置为hello world,我们可以使用下面的代码:

set(MY_VARIABLE "hello world")

其中,MY_VARIABLE表示变量的名称,hello world表示变量的值。如果变量的值是一个字符串,需要用引号将其括起来。


if

if命令用于判断条件是否成立。举个例子,假设我们需要判断变量MY_VARIABLE是否等于hello world,如果成立,则执行一些操作,我们可以使用下面的代码:

if(MY_VARIABLE STREQUAL "hello world")
    # do something
endif()

其中,MY_VARIABLE表示判断的条件,STREQUAL表示字符串相等。如果条件成立,则执行do something部分的代码。


endif

endif命令用于结束if语句块。其实,在CMake中,所有的控制流语句都需要以endif命令结束。举个例子,假设我们需要判断变量MY_VARIABLE是否等于hello world,如果成立,则打印一条消息,否则打印另一条消息,我们可以使用下面的代码:

if(MY_VARIABLE STREQUAL "hello world")
    message("MY_VARIABLE is hello world")
else()
    message("MY_VARIABLE is not hello world")
endif()

其中,message命令用于打印消息。


foreach

foreach命令用于遍历一个列表,并对其中的每个元素执行相同的操作。举个例子,假设我们有一个列表mylist,其中包含三个元素foobarbaz,我们需要将它们依次打印出来,我们可以使用下面的代码:

set(mylist foo bar baz)

foreach(item IN LISTS mylist)
    message(${item})
endforeach()

其中,item表示列表中的元素,mylist表示需要遍历的列表。LISTS表示mylist是一个列表。


总结

以上是CMake常用的命令,它们可以帮助我们更方便地管理项目的构建过程,提高项目构建的效率。除了上述命令,CMake还有很多其他的命令和功能,比如条件编译、预处理器定义、编译选项等,可以根据实际需要进行学习和使用。

#C++##面试##找工作##后端##程序员#
全部评论

相关推荐

04-07 17:05
已编辑
西北工业大学 C++
本人西北工业大学软件工程专业大二学生,因为不是很想读研,没有卷绩点综测保研无望,也不是很想考研,希望本科就能就业。然后想问问各位大佬有什么意见。我是比较喜欢钻研技术的,主攻C++,对于C++11及以上的特性还算熟悉。模版也有研究,尝试过一点基础的模板元编程。也学过一些qt,用qt写过简单的小游戏比如扫雷什么的。学校课程写过SFML进行游戏开发,写过大约一万行代码(带注释)的坦克大战,基本由我独自完成。我还专门学习过cmake,我的所有C++项目均使用cmake管理。对于划分多个子模块的稍复杂的项目结构也能管理。我比较喜欢折腾Linux,自己安装并长期使用过ubuntu和arch linux,后面主要使用ubuntu。基础的shell命令和一些配置都熟悉,可以自己从源码编译安装一些开发库和软件。对docker容器的使用还算熟练,使用docker安装配置过一些MySQL之类的软件。除此之外,我也研究过一些大模型和深度学习,我在自己电脑上本地用docker部署了ollama,前端页面以及联网搜索的搜索引擎。我自己使用pytorch训练过一些简单的深度学习网络,比如cifar100的分类训练,十几层的CNN成功率在70%左右。我最近在学习TensorRT,部署了了上面提到的模型,用pytorch导出onnx格式,用c++实现模型编译,预处理,调用api推理,后处理等部分。还尝试部署了yolo,电脑连接摄像头做了一个实时处理,当然这个是使用开源框架TensorRT-YOLO实现的,我就只准备了模型以及用OpenCV标定了一下摄像头并读取摄像头图片传过去。然后我还粗略地学习过ROS1,安装并跑过几个demo,自己也尝试过拿激光雷达做过简单的SLAM建图,但是并不深入。然后也学过一些百度Appolo无人驾驶,最近打算深入学习一下,因为我们学院有一辆这种车,我可以用。然后就是其他的一些应该没啥用的东西。我平时用vim和emacs写代码,花了很多时间做配置,当然其他的像vscode,jetbrains啥的也都用过会用。学习过一点LaTeX,平时喜欢用LaTeX做笔记。自己用github pages搭建过个人博客。各位大佬,我感觉我学的东西虽然比较多但是太杂,东一榔头西一棒槌,没有哪个算是真正深入了的,基本都只是跑demo的水平。我想今年暑假找个实习为以后积累点经验,我想请教一下我应该考虑往哪些方向发展?以及我应该在哪方面再深入一些,做点实际的东西或是学点什么。下面是我做的简历,不知道该怎么填就填了我认为比较有用的两个,求拷打。
点赞 评论 收藏
分享
评论
1
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务