cmake在编译期间会使用到的命令总结:

1、指定编译器并同时设置编译选项

  1. set(CMAKE_CXX_COMPILER "clang++" ) # 显示指定使用的C++编译器
  2. set(CMAKE_CXX_FLAGS "-std=c++11") # c++11
  3. set(CMAKE_CXX_FLAGS "-g") # 调试信息
  4. set(CMAKE_CXX_FLAGS "-Wall") # 开启所有警告
  5. set(CMAKE_CXX_FLAGS_DEBUG "-O0" ) # 调试包不优化
  6. set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG " ) # release包优化
  7. CMAKE_CXX_FLAGS设置的编译选项只会对g++有效,其他编译器不生效

当然我们也可以通过add_compile_options()设置,但是通过add_compile_options会对所有编译器生效,如:

  1. add_compile_options(-std=c++11)

在编译C代码时就会产生告警信息

2、编译库文件

1、cmake可以通过add_library利用源文件生成动态和静态库文件,指令如下:
  1. add_library(libxxx1 SHARED xxx.cpp xxxx.cpp) ##命令根据xxx.cpp和xxxx.cpp生成动态库文件libxxx1.so
  2. add_library(libxxx2 STATIC xxx.cpp xxxx.cpp) ##命令根据xxx.cpp和xxxx.cpp生成静态库文件libxxx1.a
  3. add_library(libxxx3 MODULE xxx.cpp xxxx.cpp) ##命令根据xxx.cpp和xxxx.cpp生成中间文件libxxx3,该文件不会被加载到其他地方使用
库文件生成后,我们需要对其属性进行设置,如重置库文件的名称,设置库文件的版本号等,这些需要通过set_target_properties命令实现:
  1. 1、将静态库hello_static更名为hello
  2. set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello")
  3. 2cmake在构建一个新的target时,会尝试清理掉其它使用这个名字的库,所以在构建libxxx.a时,就会清理掉libxxx.so,所以为了避免这种情况,我们需要如下指令
  4. set_target_properties(xxx PROPERTIES CLEAN_DIRECT_OUTPUT 1)
  5. set_target_properties(xxx_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
  6. 3、有时候我们需要增加动态库的版本号
  7. set_target_properties(hello PROPERTIES VERSION 1.2 SOVERSION 1) ## VERSION指代动态库版本,SOVERSION指代API版本
2、当然我们也可以使用外部现成的库文件,指令如下
  1. add_library(libxxx4 <SHARED|STATIC|MODULE|UNKNOWN> IMPORTED)
  2. IMPORTED 表明此库在工程之外,是target_link_libraries的方便形式。外部库的详细信息通过set_target_properties
  3. 设置以IMPORTED_开头的属性来完成,其中最重要的就是 IMPORTED_LOCATION 属性,它指定外部库的位置。
  4. add_library(libxxx4 STATIC IMPORTED)
  5. set_target_properties(libxxx4 PROPERTIES IMPORTED_LOCATION /path/to/libboost_system.a) ##libxxx4其实就是libboost_system.a
  6. target_link_libraries(wang libxxx4)
  7. 其实上述3条命令等价于
  8. target_link_libraries(wang /path/to/libboost_system.a)
注意:add_library除了可以生产库文件之外,还可以生成目标文件,但不打包成lib命令如下:
  1. add_library(objlib OBJECT <src>...)
  2. 这种库只编译源文件生成目标文件,但是不把这些目标文件打包进一个lib。当其他的库或者目标文件要使用这些目标文件的时候,会以这样的形式来添加,objlib是这个库的名字
  3. add_library(... $<TARGET_OBJECTS:objlib> ...)
  4. add_executable(... $<TARGET_OBJECTS:objlib> ...)

寻找外部依赖库find_package()

在一个大型项目中,免不了需要导入很多外部依赖库,比如一个项目需要使用到伯克利数据库项目,我们需要知道头文件的位置,库文件的位置以及库文件的名称,此时我们就需要find_package命令

find_package命令就是寻找该库的头文件位置、库文件位置以及库文件名称,并将其设置为变量提供给CMakelists使用。以上述伯克利数据库项目为例,

  1. find_package(DBMS)
  2. include_directories(${DBMS_INCLUDE_DIR})
  3. target_link_libraries(main ${DBMS_LIBRARY})

find_package(DBMS)会去 ${CMAKE_MODULE_PATH}指定的所有路径下寻找名字为FindDBMS.cmake的文件,并执行相应的代码,通常FindDBMS.cmake会输出如下几个变量

通常FindCURL.cmake文件会提供以下几个变量:

  1. <name>_FOUND => 表明是否查找到
  2. <name>_INCLUDE_DIR 或 <name>_INCLUDES => 表示头文件位置
  3. <name>_LIBRARY 或 <name>_LIBRARIES 或 <name>_LIBS => 表示库文件路径+名称
  4. <name>_DEFINITIONS
编写FindDBMS.cmake

FindDBMS.cmake主要使用如下两个函数find_path/find_library,其中find_path输出头文件的位置信息,find_library输出库文件的位置信息

find_path原型如下:

查找路径HINTS/PATH/PATH_SUFFIXES下,是否有文件名为name1的文件,如果有则将HINTS/PATH/PATH_SUFFIXES的内容存储在中,否则中存储_NOTFOUND

  1. find_path(<VAR>
  2. name | NAMES name1 [name2 ...]
  3. [HINTS path1 [path2 ... ENV var]]
  4. [PATHS path1 [path2 ... ENV var]]
  5. [PATH_SUFFIXES suffix1 [suffix2 ...]]
  6. [DOC "cache documentation string"]
  7. [NO_DEFAULT_PATH]
  8. [NO_CMAKE_ENVIRONMENT_PATH]
  9. [NO_CMAKE_PATH]
  10. [NO_SYSTEM_ENVIRONMENT_PATH]
  11. [NO_CMAKE_SYSTEM_PATH]
  12. [CMAKE_FIND_ROOT_PATH_BOTH |
  13. ONLY_CMAKE_FIND_ROOT_PATH |
  14. NO_CMAKE_FIND_ROOT_PATH]
  15. )
  16. 举例如下:
  17. find_path(dbms_path
  18. NAMES db_xxx.h
  19. PATHS /home/dongfang/cmake_example/find_path
  20. DOC "this is a test for find_path"
  21. )
  22. 查找路径PATH(/home/dongfang/cmake_example/find_path)下是否有db_xxx.h文件,如果有则将"/home/dongfang/cmake_example/find_path"存储在变量dbms_path
find_library原型如下:

查找路径HINTS/PATH/PATH_SUFFIXES下,是否有文件名为name1的文件,如果有则将HINTS/PATH/PATH_SUFFIXES的内容存储在中,否则中存储_NOTFOUND

  1. find_library(
  2. <VAR>
  3. name | NAMES name1 [name2 ...]
  4. [HINTS path1 [path2 ... ENV var]]
  5. [PATHS path1 [path2 ... ENV var]]
  6. [PATH_SUFFIXES suffix1 [suffix2 ...]]
  7. [DOC "cache documentation string"]
  8. [NO_DEFAULT_PATH]
  9. [NO_CMAKE_ENVIRONMENT_PATH]
  10. [NO_CMAKE_PATH]
  11. [NO_SYSTEM_ENVIRONMENT_PATH]
  12. [NO_CMAKE_SYSTEM_PATH]
  13. [CMAKE_FIND_ROOT_PATH_BOTH |
  14. ONLY_CMAKE_FIND_ROOT_PATH |
  15. NO_CMAKE_FIND_ROOT_PATH]
  16. )
  17. 举例如下:
  18. find_library(dbms_library
  19. NAMES libDBMS.so
  20. PATHS /home/dongfang/cmake_example/find_path
  21. DOC "this is a test for find_path"
  22. )
  23. 查找路径PATH(/home/dongfang/cmake_example/find_path)下是否有libDBMS.so文件,如果有则将"/home/dongfang/cmake_example/find_path"存储在变量dbms_library

在经过查找头文件和库文件路径之后,我们需要对下游负责,明确告知下游头文件路径和库文件路径是否准确找到,可使用如下命令:

  1. include(FindPackageHandleStandardArgs)
  2. find_package_handle_standard_args(DBMS dbms_path dbms_library) //如果dbms_path或者dbms_library无值,直接对下游报错

安装

不管是库文件还是目标文件,编出来之后,都需要将其放到一定的位置,方便其他目标文件使用,此时就需要install命令

  1. install(TARGETS xylib
  2. CONFIGURATIONS DEBUG
  3. RUNTIME DESTINATION bin ##可执行文件安装路径
  4. LIBRARY DESTINATION lib ##动态库安装路径
  5. ARCHIVE DESTINATION libstatic ##静态库安装路径
  6. )

cmake - 编译的更多相关文章

  1. linux 下cmake 编译 ,调用,调试 poco 1.6.0 小记

    上篇文章 小记了: 关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记. http://www.cnblogs.com/bleachli/p/4352 ...

  2. [C] tcharall(让所有平台支持TCHAR)v1.1。源码托管到github、添加CMake编译配置文件、使用doxygen规范注释

    作者:zyl910 v1.1版的改动如下—— 将源码上传到github. 调整目录结构. 添加CMake编译配置文件. 使用doxygen规范注释. 文件清单—— docs\ docs\images\ ...

  3. [C] c99int(让VC等编译器自动兼容C99的整数类型)V1.02。源码托管到github、添加CMake编译配置文件、使用doxygen规范注释

    新版本—— http://www.cnblogs.com/zyl910/p/zlstdint_v100.html[C] zlstdint(让VC.TC等编译器自动兼容C99的整数类型)V1.0.支持T ...

  4. Mysql的cmake编译与安装

    Mysql的cmake编译与安装 实验准备环境: 我的操作系统是centos6.6 编译安装MariaDB之前,我们需要准备一些需要的环境 1.开发包组套件 [root@node19 ~]# yum ...

  5. CentOS下使用cmake编译安装mysql

    一.下载安装所必需的依赖包 1.因为高版本mysql都用cmake安装,所以下载cmake wget http://www.cmake.org/files/v3.0/cmake-3.0.1.tar.g ...

  6. CentOS_5.6下使用cmake编译MySQL_5.5.11

    MySQL 最新的版本5.5.11需要cmake编译安装,估计以后的版本也会采用这种方式,网上找了一些安装方法有些地方是错的,自己整理一份 所以特地记录一下安装步骤及过程,以供参考!1 mysql 5 ...

  7. CentOS_5.6下使用cmake编译MySQL_5.5.11教程

    注:资料来自网络    Centos 5.6编译安装mysql 5.5.11 2011年06月24日 星期五 05:33 MySQL 最新的版本5.5.11需要cmake编译安装,估计以后的版本也会采 ...

  8. cmake编译安装mysql 5.6.12

    cmake安装mysql 5.6.12 从mysql 5.5 开始就要用cmake编译安装 下载mysql 下载地址:http://pan.baidu.com/s/1o68xxqE 一.安装mysql ...

  9. Win10 下Cmake编译配置 Opencv3.1 + Cuda7.5 + VS2013

    折腾了三天终于配置成功了,在此写下编译配置的全部步骤和遇到的很多坑. 整体介绍: OpenCV 中 CUDA 实现的函数还不是太多,使用前要在OpenCV的官网上确认以下你想要的功能是否已经实现,否则 ...

  10. Android开发学习之路--Android Studio cmake编译ffmpeg

      最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...

随机推荐

  1. 文艺splay,占坑等着填

    昨天CF上去就A了前三道题,然后自闭罚坐一个小时什么也没写出来23333.似乎D题人均wa3发就很烦.还是肤浅了 今天精神状态不太好,可能是晚睡的缘故,那不如明天一起写了算了 蹲一波大选结果,蹲一波s ...

  2. 一千行MySQL命令

    基本操作 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_p ...

  3. moviepy音视频剪辑:mask clip遮罩剪辑、遮片、蒙版的作用以及其包含的构成内容

    ☞ ░ 前往老猿Python博文目录 ░ 在阅读moviepy的类ImageClip的构造方法代码时,对于其中涉及遮罩的处理没有理解,到处查找遮罩的资料没有查到,最后到moviepy的官网上尝试了一下 ...

  4. 性能测试学习之路 (四)jmeter 脚本开发实战(JDBC &JMS &接口脚本 & 轻量级接口自动化测试框架)

    1.业务级脚本开发 登录脚本->思路:在线程组下新建两个HTTP请求,一个是完成访问登录页,一个是完成登录的数据提交.   步骤如下: 1) 访问登录页 2) 提交登录数据的HTTP PS:对于 ...

  5. 你必须知道的MySQL知识点

    什么是索引 索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构(掌握) 数据结构可视化 前置知识:树的高度越低查询效率越高 二叉树:不能自平衡,极端情况出现倾斜,查询效率和链表类似 红黑 ...

  6. IntelliJ IDEA2019.3.2破解/永久激活/安装教程

    我想大家用过史上最好的开发工具就是idea了,没有之一!看到大家都在找idea的激活教程,今天我也在这里跟大家分享一下. 本教程针对现在官网针对的版本是idea2019.3.2,为防止以后会更新破解失 ...

  7. javascript编写原则

    1.不要在同一行声明多个变量2.使用===或!==来比较3.使用字面量的方式来创建对象.数组,替代new Array这种形式4.switch语句必须要带default分支5.fon-in循环中的变量, ...

  8. jq中$(function(){})和js中window.onload区别

    先看下执行代码: $(function(){   console.log("jq");}) $(function(){   console.log("jq1") ...

  9. Devpress (DxReport)使用ReportDesigner (一) 基本功能

    1. Devpress (DxReport)编辑 (1) 新建一个XtraReport. (2) 在报告上点右键添加元素:   元素说明: (1) 其中有报告头,报告尾,页头,页尾,组头,组尾,详细. ...

  10. Windows10自带截屏快捷键

    Windows10自带截屏快捷键使用方法大全我们知道,QQ和微信以及第三方浏览器等软件都支持截图功能,但是这个都是基于软件的一个功能,如果我们不打开这些软件的话,就不能实现截图功能,但其实window ...