关于CMAKE构建C/C++遇到的问题汇总

据说目前已经有更为现代化的cmake,先不说现代化的cmake如何如何.本文记录是目前工作后又遇到的常规cmake的问题。不确定是否高版本的cmake已经解决了一些自身的问题.本文只做记录.

cmake 持续记录

  • CMakeLists.txt 这个文件名在构建的时候是固定的,除非使用include 包含其他的以.cmake后缀结尾的文件,比如工具链文件.
  • 一般会在CMakeLists.txt这个文件下创建build目录,在build目录下执行cmake… 然后make clean all -j8,若是不指定输出库和可执行文件的目录,则默认会在build下的对应目录(一般是子目录)下生生成.
  • 若是修改了CMakeLists.txt,不需要重新执行cmake … 直接make 会默认去执行cmake … (从中看出cmake是比较智能的).
  • 通常,当项目编译很慢的时候,执行make -j8 (-j8 表示使用多线程),如果发生报错,再执行make(这个时候不加-j xxx 则能快速定位到错误所在.
  • cmake的子目录能共享父目录里面的变量,父目录不能直接共享子目录里面的变量.
  • cmake链接到库的问题: 若是由当前的工程生成的库(无论是静态库还是动态库,可以直接通过库名进行链接,若是使用外部非当前工程生成的库,需要指定外部库的路径,再使用其外部库的库名去掉前缀和后缀)链接.或者是直接使用外部库的绝对路径链接,再或者是使用find_library查找一番,.在交叉编译时,在link到外部库时,我建议还是使用绝对路径(这是一种保险的做法,一是为了区分外部库和当前生成的库,二是因为有时候虽然指定了外部库的link路径,然后直接使用库名链接却依然找不到库(无论有没有删除cmake的缓存).
  • 使用find_library赋值的变量会存在缓存,需要删除cmake的cache文件,以免产生影响.

制作库持续记录.

  • 解决命名冲突,虽然它一直是个诟病的地方,不要使用全局变量,C++变量都用命名空间来进行管理,C的话能不能用结构体来代替.

  • 规范的用一个头文件进行声明,表示库里的函数和命名空间.

  • C++使用C编译而来的库,extern "C {头文件} 。因为C++和C的编译方式不一样,比如函数名字,经常会因为使用外部库,(问题还在于你不问问根本不知道是C的库还是C++的库),经常因为这个问题导致找不到函数符号.如果是C用C++的话,还不如直接把C文件改成C++文件.

相关推荐

  1. 关于CMAKE构建C/C++遇到问题汇总

    2024-01-28 12:26:03       37 阅读
  2. python安装cx_Oracle 遇到问题

    2024-01-28 12:26:03       13 阅读
  3. python遇到bug问题汇总

    2024-01-28 12:26:03       37 阅读
  4. gogs 搭建私人git服务器遇到问题汇总

    2024-01-28 12:26:03       33 阅读
  5. Android/iOS APP备案:遇到问题汇总指南!

    2024-01-28 12:26:03       18 阅读
  6. git关于ssh我遇到问题解决链接

    2024-01-28 12:26:03       44 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-28 12:26:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-28 12:26:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-28 12:26:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-28 12:26:03       20 阅读

热门阅读

  1. 栈的基础知识

    2024-01-28 12:26:03       24 阅读
  2. perl 通过信号控制执行超时

    2024-01-28 12:26:03       31 阅读
  3. 设计模式 :总结篇

    2024-01-28 12:26:03       38 阅读
  4. Spring Cloud Sleuth与Zipkin详解

    2024-01-28 12:26:03       42 阅读
  5. Python在网络安全防御中的应用与实践

    2024-01-28 12:26:03       35 阅读
  6. @Scheduled笔记240124

    2024-01-28 12:26:03       31 阅读
  7. vue el-date-picker 开始日期不能大于结束日期

    2024-01-28 12:26:03       35 阅读
  8. C 练习实例49-宏#define命令练习3

    2024-01-28 12:26:03       35 阅读
  9. Git(7)之提交消息模板

    2024-01-28 12:26:03       31 阅读
  10. MongoDB基本使用

    2024-01-28 12:26:03       32 阅读