深入浅出cmake

前言

最近在研究libcurl库,毫无疑问提供了cmake的编译工程。针对几个关系利害点说明。众所周知,cmake 是一个跨平台的编译功臣构建工具。其中不免对gcc或者g++的编译器进行各种配置。而本身cmake的语法就类似python等过程式的语言。cmake为什么会跨平台?首先你得对跨平台有所了解,不同平台的编译器的使用规则不同,通常无非是兼容windows和linux,而unix和linux类似。

编译器在cmake中的权重

首先跨平台代码有决定性的关系,不同的system中提供给的api不一样,我在windos中的代码想要跨平台到linux,那么肯定是不能出现#include <windos.h>这种玩意。如果出现这种东西需要根据编译器平台进行代码控制如下:

#ifdef _WIN32||_WIN64
#include <windows.h>
#else Linux
#endif
  • windows下mingw体系,基本上linux的库都有所兼容(排除chrome内核和Kvm不)
  • windows下MSVC体系,只要提供源码,就能够编译过(排除非linux标准的库,sys/*.h 这种在windows下是不能够使用的,还有socket库)
  • linux下linux-compile-toolchains。gcc和g++
  • 其他适配平台编译器llvm-clang(源码构造兼容win,linux ,mac)可定制开发编译器(包括clang的提示语法),首先你得根据现有编译器进行源码编译

cmake实现的功能,举个例子(linux-compile-toolchains):
g++ myexe -o test.cpp main.cpp -I/usr/include/xxxxdir -L/usr/lib/xxxx -lz
这是一条g++编译语句的实现

  • 其中 -o 表示 -target-output 意味输出目标,-I表示-include_directors 意味着头文件检索目录。
  • -L表示 -libraries-director意味链接库目录编译时导入的lib库目录
  • -l表示link-libraries 意味着对库进行链接
    为什么要提及compile-toolchains的编译语句?因为cmake就是针对这个进行封装的上层编译框架CMAKE_CXX_COMPILE 对应着平台编译器的执行程序,这里不深究为什么windows 执行和linux执行方式不一致导致的兼容的问题,判断平台不简单吗通过命令行的参数调用 (CMAKE_CXX_COMPILE -version 轻松跨平台判断)

为何有些CMAKE_CXX_COMPILE not found 这种低级错误都有人解决不了。因为为你对toolchains都不了解谈何解决问题?不说百分之百的了解编译器的参数,但是你得有个印象和知道参数是干嘛的对吧。

发布包和linux文件树

在这里插入图片描述
开发者的关注点应该图上红色部分。涉及编译器自动找库的问题,如果出现undefined xxx,一般就是库没有找到,你得挨个查看这些文件夹下是否存在库文件,如果存在库文件提示找不到,需要查看当前系统的环境变量是否存在默认引用目录。什么是发布包?ubuntu中 apt-get install package 这个package就是发布包,cmake的发布包来自cmakelists.txt 其中cmake 指明了install()语句。我们把整个工程叫做源码发布包而无论是dpkg 还是config-pkg 中的 package 都是适应工具进行安装包管理。

cmake 源码工程习惯

  • cmake结构树 每一个模块都应该存在cmakelists.txt。
    这是因为模块开发的思维,毫无疑问,没有软件工程规划的项目都是垃圾。
    在这里插入图片描述
  • cmake自动化测试脚本 通过cmake生成exe调用命令行进行参数测试
    测试lib需要在此之前写mian的入口函数文件。
    在这里插入图片描述
  • cmake Findxxxx.cmake
    这个文件就是一个cmake语句的文件,单独分离作为依赖库包的查找选项,通过include(Findxxxx.cmake)调用
    在这里插入图片描述
  • cmake 函数定义与使用
    在这里插入图片描述
    如果当前函数未找到函数定义那么 就应该搜索cmake官方文档查找相关定义。

掌握基本的cmake习惯,照着葫芦画瓢你还不知道怎么写吗。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值