https://blog.csdn.net/qq_31119155/article/details/79908722
先附一篇参考链接
然后给cmake的官网帮助地址:https://cmake.org/cmake/help/v3.10/index.html
可以在上面找到所有的cmake命令的解释,cmake命令共分成4类
说一下QT建立工程的过程
后面在编译选项的时候要选择cmake,它一开始默认是qmake,如果使用的是qmake,那么工程生成的是.pro的配置文件,所以这里要选择cmake,会生成cmakelist.txt的配置文件
cmake_minimum_required(VERSION 2.8)
project(test)
add_executable(${PROJECT_NAME} "main.cpp")
set(CMAKE_CXX_STANDARD 11)
find_package(OpenCV 4.4.0 REQUIRED)
target_link_libraries(test ${OpenCV_LIBS})
解释:
在项目新建完成之后,第1-3行是默认生成的。
这3个是cmake的最低配置要求
set共有3个作用
1.普通变量
set( ... [PARENT_SCOPE])
设置变量
如果后面增加了 PARENT_SCOPE 选项的话, 表示 在上层作用域/目录 设置
2. 设置缓存条目
set( ... CACHE [FORCE])
设置给定的缓存变量
由于缓存项旨在提供用户可设置的值,因此默认情况下不会覆盖现有缓存项。使用FORCE选项覆盖现有条目。
3.设置环境变量
set(ENV{} [])
设置环境变量$ENV{
可以获取该值.
find_packag()是一个搜包命令,能够将第三方的开源库一整个直接导入进来。
根据cmake官方文档可以知道,find_package()
有Module模式(基本用法,basic signature)和Config模式(full signature,完全用法),其中Module模式是基础,Config模式则更复杂高级些。
Module模式也就是基础用法(Basic Signature,这里Signature表示“用法”,而不是“签名”),Config模式也就是高级用法(Full Signature)
也就是说,只有这3种情况下才是Config模式:
find_package()
中指定CONFIG
关键字find_package()
中指定NO_MODULE
关键字find_package()
中使用了不在"basic signature"(也就是Module模式下所有支持的配置)关键字find_package()
的用法find_package( [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[NO_POLICY_SCOPE])
version
和EXACT
: 都是可选的,version
指定的是版本,如果指定就必须检查找到的包的版本是否和version
兼容。如果指定EXACT
则表示必须完全匹配的版本而不是兼容版本就可以。
QUIET
可选字段,表示如果查找失败,不会在屏幕进行输出(但是如果指定了REQUIRED
字段,则QUIET
无效,仍然会输出查找失败提示语)。
MODULE
可选字段。前面提到说“如果Module模式查找失败则回退到Config模式进行查找”,但是假如设定了MODULE
选项,那么就只在Module模式查找,如果Module模式下查找失败并不回落到Config模式查找。
REQUIRED
可选字段。表示一定要找到包,找不到的话就立即停掉整个cmake。而如果不指定REQUIRED
则cmake会继续执行。
COMPONENTS
,components
:可选字段,表示查找的包中必须要找到的组件(components),如果有任何一个找不到就算失败,类似于REQUIRED
,导致cmake停止执行。
OPTIONAL_COMPONENTS
和components
:可选的模块,找不到也不会让cmake停止执行。
Module模式查找顺序
Module模式下是要查找到名为Find
的文件。
先在CMAKE_MODULE_PATH
变量对应的路径中查找。如果路径为空,或者路径中查找失败,则在cmake module directory(cmake安装时的Modules目录,比如/usr/local/share/cmake/Modules
)查找。
后面还有configure模式下的用法,参考链接:https://www.jianshu.com/p/39fc5e548310
add_library(common STATIC util.cpp) # 生成静态库
add_library(common SHARED util.cpp) # 生成动态库或共享库
add_library 默认生成是静态库,通过以上命令生成文件名字,
1.add_library该指令的主要作用就是将指定的源文件生成链接文件,然后添加到工程中去
//Normal Libraries
add_library( [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
//Imported Libraries
add_library( IMPORTED
[GLOBAL])
//Object Libraries
add_library( OBJECT ...)
//Alias Libraries
add_library( ALIAS )
//Interface Libraries
add_library( INTERFACE [IMPORTED [GLOBAL]])
其中
而语法中的source1 source2分别表示各个源文件。
2.link_directories 设置链接库搜索目录
link_directories(directory1 directory2 ...)
该指令的作用主要是指定要链接的库文件的路径,该指令有时候不一定需要。因为find_package和find_library指令可以得到库文件的绝对路径。不过你自己写的动态库文件放在自己新建的目录下时,可以用该指令指定该目录的路径以便工程能够找到。
该指令的作用为将目标文件与库文件进行链接。
target_link_libraries( [item1] [item2] [...]
[[debug|optimized|general] - ] ...)
上述指令中的
至此,完成整个工程项目的配置,如果有报错的情况,请根据错误信息百度解决
最后给一个参考链接,也是对于cmake语法的介绍,这个比较完整,我上面所述的是针对本次工程配置所需的语法使用介绍
https://blog.csdn.net/afei__/article/details/81201039