
在 cmake 脚本中,设置编译选项可以通过 add_compile_options 命令,也可以通过 set 命令修改 CMAKE_CXX_FLAGS 或 CMAKE_C_FLAGS 。
使用这两种方式在有的情况下效果是一样的,但请注意它们还是有区别的:
例子
也可以直接在编译的时候指定:
待补充
语法
在CMake中基础的数据形式是字符串。CMake也支持字符串列表。
列表通过分号分隔。譬如两个声明给变量VAR设同样的值:
字符串列表可以通过foreach命令迭代或直接 *** 控列表命令。
CMake 支持简单的变量可以是字符串也可以是字符串列表。变量参考使用 ${VAR} 语法。多参数可以使用 set 命令组合到一个列表中。所有其他的命令
通过空白分隔符传递命令来扩展列表,例如
像大多数语言一样,Cmake 提供了控制流结构。Cmake提供了三中控制流:
更多控制流信息参见命令 if,while,foreach,macro,function文档。
在CMake中原义字符串用双引号括起来。字符串可以是多行字符串,并在其中嵌入新的行。例如
也可以在一个字符串中转义字符和使用变量
同样支持标准C中的转义
如果字符在引号之前是空格则原义字符串只是原义字符串。但是引号必须成对,例如
cmake可以使用正则表达式
cmake project 头文件必须存在这行命令, 例如 cmake_minimum_required(VERSION 3.10)
设置项目名称 project(Tutorial)
语法
例子
语法
将指定的源文件(CPP文件)生成链接文件,然后添加到工程中去。
语法
其中 <name>表示库文件的名字,该库文件会根据命令里列出的源文件来创建。而 STATIC 、 SHARED 和 MODULE 的作用是指定生成的库文件的类型。
例子
在子文件夹添加了 library 或者 executable 之后,在上层目录添加 subdirectory , 也可以在同一个CMakeList.txt中使用
它相当于 g++ 选项中的 -I 参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用。
语法:
它相当于 g++ 命令的 -L 选项的作用,也相当于环境变量中增加 LD_LIBRARY_PATH 的路径的作用。
语法:
语法:
该指令的作用主要是指定要链接的库文件的路径,该指令有时候不一定需要。因为find_package和find_library指令可以得到库文件的绝对路径。不过你自己写的动态库文件放在自己新建的目录下时,可以用该指令指定该目录的路径以便工程能够找到。
语法:
link_libraries(library1 <debug | optimized>library2 ...)
可以链接一个,也可以多个,中间使用空格分隔.
语法:
语法:
简单的例子如下:
一般情况下, make install 在不指定 prefix 默认安装在`/usr/local/bin
使用相对路径的时候,你要让cmake能够搜索到找到你动态库,就像直接使用gcc/g++来链接的时候一样,要使用-L来指定第三方库所在路径。cmake可以使用 LINK_DIRECTORIES 命令来指定第三方库所在路径,比如,你的动态库在/home/myproject/libs这个路径下,则通过命令:LINK_DIRECTORIES(/home/myproject/libs),把该路径添加到第三方库搜索路径中,这样就可以使用相对路径了,使用TARGET_LINK_LIBRARIES的时候,只需要给出动态链接库的名字就行了。
拓展:
1、CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。
2、只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。
对于大型工程项目,我们往往需要引入一些第三方库来帮助我们更好的解决问题,对于第三方库,有的是编译好的,有的是源码,情况不同,处理方式不同,由于笔者这方面也是刚入门,所以在此记下笔记,以备后续需要.
1.对于有.cmake的第三方库:
list(APPEND CMAKE_PREFIX_PATH "./thirdParty/opencv/build") #.cmake所在路径 find_package(OpenCV REQUIRED) add_executable(project main.cpp)
target_link_libraries(project ${OpenCV_LIBS}) #将exe与第三方库链接
2.对于需要源码编译(例如src文件夹中含有一堆.h,.cpp文件等)
file(GLOB_RECURSE <变量名>"src/ .hpp" "src/ .cpp" "src/ .h" "src/ .c")
add_library(<库名>STATIC ${变量名})
3.对于已经编译好的第三方库
add_library(<库名>INTERFACE IMPORTED) #将已编译好的include和lib封装成你想要的库 target_include_directories(<库名>INTERFACE <include文件夹所在路径>)
target_link_directories(<库名>INTERFACE <lib文件夹所在路径>)
target_link_libraries(<库名>INTERFACE <需要的.lib文件>)
4.将很多第三方库统一放在一个文件夹 “thirdparty” 下
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set_target_properties(<库名>PROPERTIES FOLDER "thirdparty")
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)