[转]一个CMake编译问题的解决过程

问题的提出

  • 公司的一个power-pc平台的产品,有个协议进行了修改,过程中出现了比较奇怪的情况。直接将修改后的动态库下载到设备上(原始设备是有文件系统和其他的依赖文件的,相当于部分更新应用),设备和模拟器可以正常通讯;
  • 如果将整个产品进行更新后,发现设备和模拟器通讯不正常。
  • 实际的表象是这样的,其实是忽略了一个实际情况:老的应用使用之前的Makefile直接make编译而来,部分更新的时候,自己就是直接make生成进行的局部替换,而全部替换是使用后来自己加入的CMake的方式进行的。(这是问题的根源所在)

问题的解决

  1. 开始的时候着实折腾了好长时间,一直以为是代码的问题,所以就在代码中进行了跟踪,结果怎么都找不到问题,后来就是这份代码,直接make后,替换原有的系统的协议库,发现代码没有问题,排除了代码问题。这个问题花时间很久大概有一天时间。
  2. 发现是编译方式不同导致的问题后,对两个文件进行了对比,发现使用Cmake编译出来的可执行文件是“no stripped”,以为是这个原因,后来就解决strip可执行文件的问题,在网上又是一顿狂找,最终使用“add_custom_command”定制命令的方式得到了解决,满心欢喜的看到所有应用文件都stripped了,满心以为这下可好了,但是替换以后仍然通讯异常,这个过程大概花了半天时间。
  3. 问题得不到解决很郁闷,继续对比两个文件的差异,发现即使是stripped以后,使用CMake编译出来的的文件仍然比直接使用Makefile文件make出来的文件要大不少,这些得到了一些启示,去看了下Makefile文件。通过查看Makefile和对比CMakeLists.txt文件发现,Makefile中的编译采用的宏控制,输出的是Release版本,而CMakeLists.txt中默认的输出Debug版本。找到问题所在了以后,直接又从网上找到“SET(CMAKE_BUILD_TYPE Release ON)”的方式进行了Release版本设置。
  4. 后来还发现CMakeLists.txt中的编译选项也是采用的默认方式,而Makefile中却有使用,所以干脆就直接将编译选项也直接拿过来。
    SET(CMAKE_C_FLAGS  "-O2 -pipe -fPIC -Wall -fmessage-length=0")
    SET(CMAKE_CXX_FLAGS "-O2 -pipe -fPIC -Wall -fmessage-length=0")
  5. 然后直接进行了编译,看到编译后的应用果然文件大小又小了很多,这下觉得没有问题了,进行整体更换,reboot系统,查看模拟器与设备的通讯情况,正常。ok,这一天算是没有白费,将正常后的CMakeLists.txt都更新到svn中。

我的同类文章

嵌入式开发相关(25)

http://blog.csdn.net

时间: 2024-10-31 05:31:17

[转]一个CMake编译问题的解决过程的相关文章

一个图文混排问题的解决过程

需求如所示:左边的是效果图,右边的是完成后的图                 具体需求描述:用户的回复一条就是一个cell,字数不定.当存在某种条件时,需要在文字(可能换行)的最后一个字后面添加一个能点击的删除按钮小图标,文字支持emoji表情符号. 解决过程: 1.一看到这种文字中需要穿插图片的就想到了富文本中的NSTextAttachment对象,它可以包装一个image后生成一个富文本,再给UILabel显示就能完成显示需求,但是,该对象只能包装UIImage对象,无法监听图片的点击事件

思考一个问题的解决过程

环境:CentOS 6.2 问题描述: MySQL返回错误提示为: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 项目中需要实现代码导出MySQL数据库中表结构的功能,于是我先单独写这个功能,然后整合上去,单独的小程序可以了,但是整合上去却无法连接MySQL数据库,返回的错误码和提示如标题. 问题分析: 这个问题出现的奇怪之处是,单独的小程序可以使用,但是整合到项目中却不可以使用,而且错误提示是/

编程经验:Cmake编译Opencv3.0&extra model所遇到的种种问题~

前段时间调研一个算法,作者提供了源代码,很自豪的宣布源代码已经集成在了3.0中,于是我就开始了"苦逼"的配置之旅,结果遇到了N个bug,还好自己有截图的习惯,本文就说说我遇到的问题,以及如何解决部分问题. 1. opencv_contrib-master 这是Opencv3.0的额外模块,里面提供了诸如xfeatures2d等新模块,集成了近两年来提出的优秀算法,比如我之前研究的Latch特征,就集成在了这个extra module中,但最主要的是,这个模块中的代码支持Matlab混合

linux下cmake编译C++工程之总结篇

昨天正式把项目编译完成,经历了一周的摸索和折磨后,最后也想:oh,it's so easy! 但是过程确实困难的,因为cmake官方只有API的解释,而且解释的不是很清楚. 一般项目都是狠复杂的层级关系 这种如何来写cmake呢? 首先要知道一个很重要的东西,cmake是一定要从顶级目录开始,才能继承目录,比如直接在project1目录里用../lib是无效的,因为cmake并不知道: 而如果在project下建立cmakelists.txt 然后add_subdir(project1),pro

简单的Linux 驱动模块编译,加载过程

简单的Linux 驱动模块编译,加载过程 2010-03-14 14:48:24|  分类: Driver |  标签: |字号大中小 订阅 本文记录我的第一个Linux设备驱动程序的编译过程.遇到问题的解决方法. 环境:2.4.18-14的内核,Linux内核源码:2.4.18.       Linux内核源码路径:/usr/src/linux(这个源码是从kernel.org网站download的2.4.18版本)        按照<linux设备驱动开发详解>一书中的步骤实现经典例子&

Sublime Text3配置及控制台乱码[cmd杀死进程乱码/编译文件乱码]解决方法

[NodeJs] 1.安装 http://nodejs.cn/download/ 2.安装过程省略(因为已经安装过了) 和平时安装软件没区别 3.配置环境 计算机--->属性-->高级系统设置-->环境变量-->path-->编辑 每一个变量值和前一个变量值用;隔开将D:\Program Files\nodejs\node.exe;写入 4.打开cmd 输入node -v  和 npm -v 看是否安装成功 [Sublime Nodejs] 1.安装nodejs插件 http

在 Linux 下用 CMAKE 编译安装 OpenCV 3.2.0

[安装相关软件和库] 1.安装CMAKE:这里使用apt-get来安装; CMAKE 是一个跨平台编译工具,能够输出各种makefile,和project 文件,指导编译器编译,对CMAKE具体的可以自行搜索,这里推荐一个链接: http://www.cnblogs.com/lyq105/archive/2010/12/03/1895067.html 在联网下,在终端输入: sudo apt-get install cmake [编译.安装OPENCV] 1.从OPENCV官网下载OpenCV-

STM32 .ld链接文件分析及一次bug解决过程

目录 STM32 .ld链接文件分析及一次bug解决过程 问题描述 解决办法 ld文件解析 后续 STM32 .ld链接文件分析及一次bug解决过程 问题描述 原子板的代码中含有一个关于使用外部SRAM的功能,由于本人的开发板的SRAM只有512K,因此稍微修改了一下代码,同时使用GCC进行编译,但是这里却报错了,源码如下: //内存池(4字节对齐) __align(4) u8 mem1base[MEM1_MAX_SIZE]; __align(4) u8 mem2base[MEM2_MAX_SI

编译型和解释型的区别&amp;&amp;Java从编译到执行的过程

借鉴: 1  http://www.cnblogs.com/bluestorm/archive/2012/12/09/2810167.html           区别 2  http://blog.jobbole.com/53152/       编译的过程 3  http://jingyan.baidu.com/article/b24f6c82de6bcf86bfe5dad4.html          Java从编译到执行的过程(完整) Java编译-下载-解释-执行的过程: 在Java编