嵌入式linux应用程序移植方法总结
嵌入式linux应用程序移植方法总结
前段时间一直在做openCapwap的移植和调试工作,现在工作已接近尾声,编写本文档对前段工作进行一个总结,分享下openCapwap移植过程中的经验和感悟。江浩写的《CAPWAP移植进展.docx》对openCapwap的移植过程有了比较详细的描述,所以在此就不涉及技术细节了,本文档主要以openCapwap的移植为例,总结嵌入式linux应用程序移植的一般方法和步骤,为以后可能需要的移植工作提供一些的思路。
嵌入式linux应用程序移植的步骤包括:
1、准备好交叉编译环境
在安装有Linux操作系统的PC上安装对于平台的交叉编译器,并将交叉编译器加到环境变量中,如export PATH=$PATH:/opt /toolchain/rsdk-1.3.6-5281-EB-2.6.30-0.9.30/bin, 然后在终端界面里看交叉编译器版本,如敲mips-linux-gcc –v,显示版本号则表示安装成功。
(交叉编译器一般是平台厂商提供的,比如我们的交叉编译器就是mips-linux-gcc,是瑞昱提供的。)
2、准备好源代码
准备好需要编译的源代码库包,如capwap-0.93.3,需要注意的是,不仅需要准备要编译的源代码库包,还需要准备该源码包依赖的包,例如capwap-0.93.3依赖安全加密相关的包openssl和多线程相关的包pthread,这些包也需通过编译成静态库或动态库供主承销包调用。
3、修改Makefile
一般的源码库可以通过运行./Configure来制定编译器gcc,目标板的架构已经生产应用程序和库的目录。如果没有Configure文件就需要手动打开Makefile文件来修改,主要需要修改的地方有:(1)编译器的类型,(2)需要库的头文件路径;(3)需要库的链接路径(4)生成应用程序的路径。如openCapwap移植过程,将CC=gcc行用CC=mips-linux-gcc替换。
4、编译源代码
在源码包的主路径下运行Make,除非运气特别好,一般情况下是会报错的,需要根据报错的类型进行相应的修改。常见的报错类型有:(1)依赖的库包不支持该CPU架构,需要更换该架构的库包,如Capwap自带的openssl库不支持mips。#error "This openssl-devel package does not work your architecture?"(2)依赖的库没有经过交叉编译就拿来用了,如#error“./static/libssl.a: could not read symbols: File in wrong format”即libssl.a库文件格式是X86架构下的不支持mips架构。(3)源代码中有c语言方面的错误,一般是和交叉编译器版本不匹配引起的。
一步步解决完这些错误后,然后终于可以生产对应目标板的应用程序了。但是生产相应的应用程序才是万里长征的第一步,让程序正确的运行才是最终目标。
5、安装应用程序
安装应用程序有两种方法,一是将应用程序放到目标板的文件系统中,通过烧镜像的方法将程序下载到目标板上;另一种是通过像tftp的方法下载到目标板上。后一种方法便捷灵活,在调试程序的过程中应用较多。需要注意的是,还需要将应用程序需要的动态库也下载到目标板上,应用程序才能跑。例如在我们移植capwap中出现,在完成烧录后,运行WTP报错。Error:系统化找不到pthread.so。分析:在终端中进入lib目录,发现缺少libpthread.so动态库。故原因在于RTL8198目标板SDK编译时没有将libpthread.so动态库添加到目标板系统的lib库文件当中。
6、运行调试应用程序
调试应用程序让其能够正确的工作,才是移植工作最重要的部分,这需要对应用程序的流程很熟悉,然后通过打印日志的方法看程序运行的路径,分析日志与正确的流程的差异来确定出错的地方。常见的出错地方有:(1)内存分配函数;(2)系统位数不一样;(3)字节顺序问题(大端小端);(4)浮点数的表示问题等。如我们在移植过程中遇到的malloc函数行为不同的问题。以上都是平时移植过程中需要重点注意的地方。
嵌入式linux应用程序移植方法总结的更多相关文章
- 嵌入式linux应用程序调试方法
嵌入式linux应用程序调试方法 四 内存工具 五 C/C++代码覆盖.性能profiling工具 四 内存工具 您肯定不想陷入类似在几千次调用之后发生分配溢出这样的情形. 许多小组花了许许多多时间来 ...
- gdbserver远程调试嵌入式linux应用程序方法
此处所讲的是基于gdb和gdbsever的远程调试方法.环境为:PC机:win7.虚拟机:10.04.下位机:飞嵌TE2440开发板. 嵌入式linux应用程序的开发一般都是在linux里面编写好代码 ...
- 《嵌入式linux应用程序开发标准教程》笔记——6.文件IO编程
前段时间看APUE,确实比较详细,不过过于详细了,当成工具书倒是比较合适,还是读一读这种培训机构的书籍,进度会比较快,遇到问题时再回去翻翻APUE,这样的效率可能更高一些. <嵌入式linux应 ...
- 嵌入式Linux应用程序开发详解------(创建守护进程)
嵌入式Linux应用程序开发详解 华清远见 本文只是阅读文摘. 创建一个守护进程的步骤: 1.创建一个子进程,然后退出父进程: 2.在子进程中使用创建新会话---setsid(): 3.改变当前工作目 ...
- 【转】将 Linux 应用程序移植到 64 位系统上
原文网址:http://www.ibm.com/developerworks/cn/linux/l-port64.html 随着 64 位体系结构的普及,针对 64 位系统准备好您的 Linux® 软 ...
- 使用Visual Studio 利用WinGDB编译和远程调试嵌入式Linux的程序
写这篇文章的目的在于帮助那些既要使用Visual Studio编写程序又要开发和调试嵌入式Linux 程序的苦命程序员们! 第一步, 安装 WinGDB ,下载位置 http://www.wingd ...
- linux第三方程序移植
摘要:在linux开发过程中经常需要用到第三方的程序,有时需要用到它们的库,有时需要它们生成的可执行文件,如何正确地编译这些第三方的程序,以方便地使用和开发自己需要的程序,将是本文要论述的内容. 1. ...
- 嵌入式 Linux应用程序如何读取(修改)芯片寄存器的值
这一问题来自项目中一个实际的需求:我需要在Linux启动之后,确认我指定的芯片寄存器是否与我在uboot的配置一致. 举个例子:寄存器地址:0x20000010负责对DDR2的时序配置,该寄存器是在u ...
- linux不同环境下c/c++程序移植方法
这边之前的大多数项目都用的java,而自己用的c++,等到快要上线的时候才发现线上机器的gcc和libc的版本都巨低,跟自己测试开发用的环境不兼容,编译出的c++可执行文件没法运行.解决c++程序的移 ...
随机推荐
- C#中REF和OUT的区别
在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值,并保持该更改.若要通过引用传递参数, 可使用ref或out关键字.ref和out这两个关键字都能够提供相似的功 ...
- Java设计模式 工厂模式概念解析
定义:工厂模式专门负责将大量有共同接口的类实例化.工厂模式可以动态决定将哪一个类实例化,而不必事先知道每次要实例化哪一个类. 三种形态: 简单工厂模式:又称静态工厂方法 工厂方法模式:又称多态性工厂模 ...
- daydayup1 codeforces141c
题意:给定n个数字,代表每个人前面有几个人比他高,让你构造一个height数组,满足条件 思路:直接贪心就好,假设到第i个人,设他的高度为i-a[i]+1,前面比他高的人每个人的高度加1
- JavaScript中的作用域
很多(JavaScript)开发者都在讨论"作用域",但它是什么?它们在JavaScript中的任何地方!我发现很多年轻的开发者不知道作用域是什么.他们中大多数人可以用jQuery ...
- 搬运:Python for Windows——监控Windows某个目录下文件的变化
https://win32com.goermezer.de/content/view/286/285/ 这个网站真是给力,不多说,代码直接搬运过来,还有我的测试结果,拿走不谢! import os i ...
- 不支持关键字“data source”
网上大部分都是说data source之间需要插入一个空格或者都是一些低级的拼写错误造成的,但是我没有出现这些情况,是通过把data source改成server解决的,具体config里面的代码如下 ...
- Raspberry Pi Resources-Using the UART
参考:RPi Serial Connection 本文来自:http://www.raspberry-projects.com/pi/programming-in-c/uart-serial-port ...
- 【转载】C/C++中extern关键字详解
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...
- c++ redis-client
http://hahaya.github.io/operator-redis-under-linux/#0-tsina-1-10809-397232819ff9a47a7b7e80a40613cfe1 ...
- [网络技术][转]网卡的offload概念
网络数据包分析 网卡Offload 对于网络安全来说,网络传输数据包的捕获和分析是个基础工作,绿盟科技研究员在日常工作中,经常会捕获到一些大小远大于MTU值的数据包,经过分析这些大包的特性,发现和网卡 ...