cmake前言

首先允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。一些使用 CMake 作为项目架构系统的知名开源项目有 VTK、ITK、KDE、OpenCV、OSG 等 。我是受够了手写makefile。

cmake标准三步走

  • mkdir src

  • cd build,mkdir build, create cMakeLists.txt

  • cd build&& cmake ..

  • make clean && make

为啥呢?因为cmake不支持清空缓存=手动狗头=。如果要删除缓存,直接删除build即可

cmake模板

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
# CMake 最低版本号要求cmake_minimum_required(VERSION 2.8)# 项目名称project("cmake_test")# 添加预编译选项, 如使用-D定义宏等等ADD_DEFINITIONS(    "-DMY_BIG"    "-DYOU_LITTLE")# 添加编译选项add_compile_options(    "-std=c++11"    "-g3"    "-Wall"    "-Wextra")# 添加链接选项#set(CMAKE_EXE_LINKER_FLAGS "-Wl,rpath=./lib")# 添加头文件路径, 相当于g++的-Iinclude_directories(    "./include"    "./include/jansson")# 指定库文件路径, 相当于g++的-L(必须使用绝对路径)link_directories(    "/root/projects/cmake_test/lib")# 指定库文件, 相当于g++的-l(必须使用绝对路径)link_libraries(    "libjansson.a")# 查找指定目录下的所有源文件aux_source_directory("." DIR_MAIN)aux_source_directory("./func_001" DIR_FUNC_001)aux_source_directory("./func_002" DIR_FUNC_002)# 指定生成目标add_executable(    "cmake_test.out"    ${DIR_MAIN}    ${DIR_FUNC_001}    ${DIR_FUNC_002})

实际例子

单个源码文件
  • 源码

123456
#includeint main(){        printf("helloworld\n");}
  • makefile

12345678
# CMake 最低版本号要求cmake_minimum_required (VERSION 2.8)# 项目信息project (Helloworld)# 指定生成目标add_executable(Hellworld helloworld.c)
  • 运行

单个文件依赖外部头文件
  • 源码

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
#include #include #include #include#include "base64.h"#define LEN_OF_KEY 24int tripleDesDecrypt(const char * key1,const char *pInEncrypt,char *pOutDecrypt,int* outDecryptLen ){        if(NULL==key1||NULL==pInEncrypt){                return -1;        }        unsigned char iv[8] = { '0','0','0','0','0','0','0','0' };        DES_key_schedule des_key1;        DES_key_schedule des_key2;        DES_key_schedule des_key3;        const_DES_cblock key_SSL1, key_SSL2, key_SSL3;        DES_cblock ivec;        int key_len;        unsigned char key_value[LEN_OF_KEY]={0}; /* 补齐后的密钥 */        /* 构造补齐后的密钥 */    key_len = strlen(key1);    memcpy(key_value, key1, key_len);    memset(key_value + key_len, 0, LEN_OF_KEY - key_len);        memcpy(&key_SSL1, key_value, (size_t)8);        memcpy(&key_SSL2, key_value+8, (size_t)8);        memcpy(&key_SSL3, key_value+16, (size_t)8);        DES_set_key_unchecked(&key_SSL1, &des_key1);        DES_set_key_unchecked(&key_SSL2, &des_key2);        DES_set_key_unchecked(&key_SSL3, &des_key3);        memcpy(ivec, iv, sizeof(iv));         unsigned char nobase64_buff[1024*64]={0};    int len = 0;        len=  Base64Decode(pInEncrypt, strlen(pInEncrypt), (char*)nobase64_buff, sizeof(nobase64_buff), BASE64_FLAG_NO_PADDING | BASE64_FLAG_NO_WRAP | BASE64_FLAG_URL_SAFE);        DES_ede3_cbc_encrypt( nobase64_buff, (unsigned char*)pOutDecrypt,len, &des_key1, &des_key2, &des_key3,&ivec,DES_DECRYPT);         unsigned char buwei = pOutDecrypt[len-1];    printf("srcData=%s,buwei=%d,len=%d\n",pOutDecrypt,buwei,len);      pOutDecrypt[len - buwei] = 0;        *outDecryptLen=len-buwei;        return 0;}int main(){        /* 加载算法 */         int outLen=0;         char outData[512]={0};          tripleDesDecrypt("121221","npOUnPD1DKH1rWZ2Pgl-Iw",outData,&outLen );        printf("outData=%s\noutlen=%d\n",outData,outLen);                    tripleDesDecrypt("121221","yLIJLMDOiVrDnj8tX6FNeg",outData,&outLen );        printf("outData=%s\noutlen=%d\n",outData,outLen);         printf("-------------2---------------\n");          tripleDesDecrypt("121221","DyORM6-lGeY",outData,&outLen );        printf("outData=%s\noutlen=%d\n",outData,outLen);                    tripleDesDecrypt("121221","wjJqjcnzDJKmsR3uM98f3w",outData,&outLen );           printf("outData=%s\noutlen=%d\n",outData2,outLen);           return 0;}
  • cmake文件

1234567891011121314151617181920212223242526272829
#最低版本cmake_minimum_required(VERSION 2.8)#项目名称project("3des_test")add_compile_options(    "-g"    "-Wall")include_directories(    "./")link_directories(    "/root/openssl")link_libraries(    ":libcrypto.so")#表示当前路径源文件aux_source_directory("." DIR_MAIN)add_executable( "3des.out"  ${DIR_MAIN})
一次输出多个可执行文件时

例如上文,我除了要输出3descbc之外,我还要输出3des的ecb,我们可以将源码文件放在两个目录下

12345678910111213141516171819202122232425262728293031323334
#最低版本cmake_minimum_required(VERSION 2.8)#项目名称project("3des_test")add_compile_options(    "-g"    "-Wall")include_directories(    "./")link_directories(    "/root/openssl")link_libraries(    ":libcrypto.so")#表示当前路径源文件aux_source_directory("." DIR_MAIN)aux_source_directory("./3desecd" DIR_ECB)add_executable( "3descbc.out"  ${DIR_MAIN})add_executable( "3desecb.out"  ${DIR_ECB})

其他

cmake默认环境变量
12345678910111213141516171819202122232425262728293031323334353637
cmake_minimum_required(VERSION 3.2)message(STATUS "CMAKE_C_FLAGS = " ${CMAKE_C_FLAGS})message(STATUS "CMAKE_C_FLAGS_DEBUG = " ${CMAKE_C_FLAGS_DEBUG})message(STATUS "CMAKE_C_FLAGS_MINSIZEREL = " ${CMAKE_C_FLAGS_MINSIZEREL})message(STATUS "CMAKE_C_FLAGS_RELEASE = " ${CMAKE_C_FLAGS_RELEASE})message(STATUS "CMAKE_C_FLAGS_RELWITHDEBINFO = " ${CMAKE_C_FLAGS_RELWITHDEBINFO})message(STATUS "CMAKE_CXX_FLAGS = " ${CMAKE_CXX_FLAGS})message(STATUS "CMAKE_CXX_FLAGS_DEBUG = " ${CMAKE_CXX_FLAGS_DEBUG})message(STATUS "CMAKE_CXX_FLAGS_MINSIZEREL = " ${CMAKE_CXX_FLAGS_MINSIZEREL})message(STATUS "CMAKE_CXX_FLAGS_RELEASE = " ${CMAKE_CXX_FLAGS_RELEASE})message(STATUS "CMAKE_CXX_FLAGS_RELWITHDEBINFO = " ${CMAKE_CXX_FLAGS_RELWITHDEBINFO})message(STATUS "CMAKE_EXE_LINKER_FLAGS = " ${CMAKE_EXE_LINKER_FLAGS})message(STATUS "CMAKE_EXE_LINKER_FLAGS_DEBUG = " ${CMAKE_EXE_LINKER_FLAGS_DEBUG})message(STATUS "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL = " ${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL})message(STATUS "CMAKE_EXE_LINKER_FLAGS_RELEASE = " ${CMAKE_EXE_LINKER_FLAGS_RELEASE})message(STATUS "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO = " ${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO})message(STATUS "CMAKE_MODULE_LINKER_FLAGS = " ${CMAKE_MODULE_LINKER_FLAGS})message(STATUS "CMAKE_MODULE_LINKER_FLAGS_DEBUG = " ${CMAKE_MODULE_LINKER_FLAGS_DEBUG})message(STATUS "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL = " ${CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL})message(STATUS "CMAKE_MODULE_LINKER_FLAGS_RELEASE = " ${CMAKE_MODULE_LINKER_FLAGS_RELEASE})message(STATUS "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO = " ${CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO})message(STATUS "CMAKE_SHARED_LINKER_FLAGS = " ${CMAKE_SHARED_LINKER_FLAGS})message(STATUS "CMAKE_SHARED_LINKER_FLAGS_DEBUG = " ${CMAKE_SHARED_LINKER_FLAGS_DEBUG})message(STATUS "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL = " ${CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL})message(STATUS "CMAKE_SHARED_LINKER_FLAGS_RELEASE = " ${CMAKE_SHARED_LINKER_FLAGS_RELEASE})message(STATUS "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO = " ${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO})message(STATUS "CMAKE_STATIC_LINKER_FLAGS = " ${CMAKE_STATIC_LINKER_FLAGS})message(STATUS "CMAKE_STATIC_LINKER_FLAGS_DEBUG = " ${CMAKE_STATIC_LINKER_FLAGS_DEBUG})message(STATUS "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL = " ${CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL})message(STATUS "CMAKE_STATIC_LINKER_FLAGS_RELEASE = " ${CMAKE_STATIC_LINKER_FLAGS_RELEASE})message(STATUS "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO = " ${CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO})
CMake显示gcc/g++的详细编译信息
12
make的时候, 使用如下命令:make VERBOSE=1

.so 依赖目录 cmake_cmake浅析相关推荐

  1. .so 依赖目录 cmake_CMake 的研究与学习笔记

    cmake是一个跨平台项目生成工具,他根据不同的平台从源代码中生成相应的项目工程,可以生成包括makefile,vs等项目文件. CMake的使用 以生成makefile为例 cmake dir : ...

  2. .so 依赖目录 cmake_CMAKE最全实战(2)

    阅读本篇文章前,请阅读CMAKE最全实战(1),这2篇是有关联. 1.静态库与动态库构建 从本节开始,我们不再折腾Hello World 了,我们来折腾Hello World 的共享库. 本节的任务: ...

  3. android dagger2 懒加载,Android Dagger依赖注入框架浅析

    今天接触了Dagger这套android的依赖注入框架(DI框架),感觉跟Spring 的IOC差不多吧.这个框架它的好处是它没有采用反射技术(Spring是用反射的),而是用预编译技术,因为基于反射 ...

  4. C++ 包含目录、库目录、附加依赖项详解

    在使用opencv库,以及其他库的时候,经常会需要添加包含目录.库目录.附加依赖项等.现做一个总结吧. 1.包含目录 是.h的头文件所在的目录,如果没有正确包含目录,代码中会出现红色的警告,各种未定义 ...

  5. 开发函数计算的正确姿势——轻松解决大依赖部署

    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算 ...

  6. 手动添加oracle驱动到maven依赖,并使用springboot连接

    在配置好maven环境变量情况下, 首先找到oracle自带的驱动: 在安装目录下: dos输入命令: mvn install:install-file -DgroupId=com.oracle -D ...

  7. yarn临时目录 没有jar包_复习之yarn

    yarn 简介 yarn 官网:https://www.yarnpkg.com/zh-Hans/ yarn 是由Facebook.Google.Exponent 和 Tilde 联合推出了一个新的 J ...

  8. Angular项目目录结构

    前言:不支持MakeDown的博客园调格式的话,真的写到快o(╥﹏╥)o了,所以老夫还是转战到CSDN吧,这边就不更新啦啦啦~ CSDN地址:https://blog.csdn.net/Night20 ...

  9. 为人所设置的依赖安装程序

    下载InnoDependencyInstaller-master.zip 介绍 Inno Setup Dependency Installer是一组Inno Setup script和一组Pascal ...

最新文章

  1. 6月28日 cf总结
  2. Git 学习第二天(一)
  3. shell之实战应用一(查找xml文档中的关键字段)
  4. python堆排序求topn_堆排序和topN算法
  5. Hive架构及安装部署(远程数据库模式MySQL)
  6. conda install 出错
  7. Linux下oracle11g 导入导出操作详细
  8. windows下配置caffe-matlab接口
  9. 贪心策略构筑“奶牛铁塔”(洛谷P2676题题解,Java语言描述)
  10. 深圳蛇口人民医院办理健康证,免费体检,2017年后国家承担体检费用
  11. Vitalik:Rollups预计在短期和中长期成为以太坊扩容的基石
  12. osgb转json_基于CAD平台的OSGB数据分级渲染的方法与流程
  13. ong拼音汉字_拼音ong到底怎么读?
  14. 谈谈PRNU 光响应非均匀性
  15. python的PIL库
  16. 尾气冒黑烟是什么问题_尾气冒黑烟是坏了?教你通过尾气辨别爱车是否故障!...
  17. 弦外雨,晚风急 吹皱芳华太无情
  18. imx6ul双网口(LAN8720A)
  19. 如何设计一个聊天机器人?谈谈聊天机器人技术栈
  20. python 监目录文件变动,然后在做些其它的操作,watchdog 详细解答

热门文章

  1. 安卓 sharedpreferences可以被其它activity读取_【安卓逆向】“一份礼物”之我要o泡逆向分析...
  2. 13-Qt6 QMap
  3. java 肌汉模式_设计模式之原型模式详解(附源代码)
  4. celery java_Celery详解
  5. 内存很空却频繁gc_NonRegisteringDriver造成的内存频繁FullGc
  6. curl命令使用总结
  7. vue2.0 唤起百度地图app_如何标注百度地图?
  8. pip升级之后出现:/usr/bin/pip: No such file or directory
  9. mysql日志恢复数据_Mysql 通过binlog日志恢复数据
  10. java 递归生成格雷码_格雷码的递归生成