3
回复

一些Erlang的资源 Erlang

四季修心 回复了问题 • 4 人关注 • 1546 次浏览 • 2015-08-05 16:02 • 来自相关话题

0
回复

查看Android SDK的版本信息 环信技术支持 环信_Android

回复

lizg 发起了问题 • 0 人关注 • 1878 次浏览 • 2015-05-22 12:45 • 来自相关话题

3
回复

提示 录音失败,请重试! 是什么原因呢 环信技术支持

William Zhao 回复了问题 • 2 人关注 • 2228 次浏览 • 2015-08-05 15:45 • 来自相关话题

1
回复

麻烦问下使用demo里面的ApplyViewController这个单例 获取好友申请条数始终是0 好友申请

lifei9241 回复了问题 • 2 人关注 • 1520 次浏览 • 2015-08-05 15:34 • 来自相关话题

3
最佳

EMConversation未读数unreadMsgCount可以设置吗? 环信_Android

zero47 回复了问题 • 2 人关注 • 1858 次浏览 • 2015-08-05 14:35 • 来自相关话题

1
回复

webim,android,ios发送消息之后怎么判断是否发送成功 环信_iOS 环信_Android 环信_WebIM

beyond 回复了问题 • 2 人关注 • 1932 次浏览 • 2015-08-05 10:42 • 来自相关话题

1
回复

有时候必须重新登录后,才能收到验证信息 环信技术支持 环信_Android

一等到天幻 回复了问题 • 2 人关注 • 542 次浏览 • 2015-08-05 09:26 • 来自相关话题

5
回复
1
回复

环信demo中聊天界面的时间cell 环信_RestAPI iOS

Half12345 回复了问题 • 2 人关注 • 1226 次浏览 • 2015-08-04 15:36 • 来自相关话题

1
回复

WEBIM中的TOKEN到底如何获得 环信_WebIM

beyond 回复了问题 • 2 人关注 • 1037 次浏览 • 2015-08-04 15:15 • 来自相关话题

2
评论

Ubuntu实现树莓派交叉编译 cross compile

admin 发表了文章 • 2009 次浏览 • 2015-08-04 13:55 • 来自相关话题

一、交叉编译

在一个平台上生成另一个平台上的可执行代码。为什么要大费周折的进行交叉编译呢?一句话:不得已而为之。有时是因为目的平台上不允许或不能够安装所需要的编译器,而又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行所需要的编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。

要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译源代码,最终生成可在目标平台上运行的代码。     
常见的交叉编译例子如下:
在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。
 
二、名词解释
 
Linux下的大多数软件包都使用Autoconf/Automake工具自动生成Makefile,只要使用“./configure”,“make”,“make install”就可以把程序安装到Linux系统中去了。编译第三方源代码时,可以看下工程中的readme和install文件,一般情况下都会写编译步骤。
 
 1、./configure 常用参数  [--build] | [--host] | [--target] | [--prefix] | [--help]

注意:host和--host不是一个意思,host是指宿主机,即编辑和编译程序的平台,是个名词;--host是设置执行文件所运行的主机,是个动词。
 
>> ./configure: 用来生成对应的 Makefile;
 
>> --build: 执行代码编译的主机,正常的话就是你的主机系统。若无指定使用host的值;
>> --host: 编译出来的二进制程序所执行的主机, 交叉编译工具链的前缀。因为绝大多数是如果本机编译就本机执行,所以这个值就等于build。但是交叉编译的时候build和host需要设置不同值,用host指定运行主机,即host != build的时候编译才是交叉编译。若无指定将会运行`config.guess'来检测;
 
>> --prefix: 安装目录,比如 --prefix=/usr 意思是将该软件安装在 /usr 下面,执行文件就会安装在 /usr/bin (而不是默认的 /usr/local/bin),资源文件就会安装在 /usr/share(而不是默认的/usr/local/share);
 
>> --help: 查看参数;
 
>> --target: 这个参数比较特殊,表示需要处理的目标平台名称,主要在程序语言工具如编译器和汇编器上下文中起作用,若无指定使用host的值。一般用来编译工具,比如给arm开发板编译一个可以处理mips程序的gcc,那么--target=mips;
 
>>>> 举例说明:编译gcc
 
>> ./configure --build=i386-linux --host=arm-linux --target=mipsel-linux --prefix=$(pwd)/_install
 
用i386-linux的编译器进行gcc的编译,编译出的gcc运行在arm-linux, 编译结果存放到$(pwd)/_install路径下,编译出的gcc用来编译能够在mipsel-linux下运行的代码。
 
2、Makefile包含了一些基本的预先定义的操作: 
>>make: 根据Makefile编译源代码,连接,生成目标文件,可执行文件;>>make clean: 清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件;>>make distclean: 类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile;>>make test / make check: 检查make,确保make没有出错,一般在make install之前执行;>>make install: 将编译成功的可执行文件安装到指定目录中,一般为/usr/local/bin目录;>>make dist: 产生发布软件包文件(即distribution package)。这个命令将会将可执行文件及相关文件打包成一个tar.gz压缩的文件用来作为发布软件的软件包。它会在当前目录下生成一个名字类似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我们在configure.in中定义的AM_INIT_AUTOMAKE(PACKAGE, VERSION);>>make distcheck: 生成发布软件包并对其进行测试检查,以确定发布包的正确性。这个操作将自动把压缩包文件解开,然后执行configure命令,并且执行make,来确认编译不出现错误,最后提示你软件包已经准备好,可以发布了; 

三、交叉编译源代码

1、环境
Ubuntu
 
2、树莓派交叉编译工具安装step
 
step1.下载树莓派交叉编译工具https://github.com/raspberrypi/toolsstep2. 将源码放到各用户都能share的文件夹下,如/usr/toolsstep3. 将交叉编译工具的路径加到环境变量中,为了以后启动不用再设置,我加到了bashrc中
1 $nano ~/.bashrc
2 #在文件的末尾加上: export PATH=$PATH:/usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
3 $source .bashrc
step4. 检测是否安装成功
way1: 
$arm #双tab显示以下内容





 
way2:
$arm-linux-gnueabihf-gcc -v
#能显示正确信息

$arm-linux-gnueabihf-g++ -v
#能显示正确信息注意:交叉编译时,如果出现arm-linux-gnueabihf-XXX找不到,确定arm-linux-gnueabihf-XXX -v 是否能输出正确信息,如果能,可以切到root下进行编译

三、编译源代码

1、在写编译脚本时,一定要确保编译器写的是交叉编译的编译器。比如比较常用的Makefile,
1 demo: $(obj)
2 $(CXX) -o $@ $^ $(LDFLAGS)其中的CXX必须是arm-linux-gnueabihf-g++才能编译出正确的在树莓派上的可执行文件。

2、编译第三方库

如果你想设置全局的CC和CXX变量,在每次打开一个新的Terminal时,输入以下命令:
1 $export CC=arm-linux-gnueabihf-gcc
2 $export CXX=arm-linux-gnueabihf-g++ 其他的全局变量同上。

以下列几个常用的第三方库交叉编译步骤

1>> sqlite3 http://www.sqlite.org/download.html sqlite-autoconf-3081002.tar.gz
step1:  make cleanstep2:  ./configure --host=arm-linux-gnueabihf --prefix=/usr/local/tools/sqlite3step3:  makestep4:  make install

 

2>>curl http://curl.haxx.se/download.html  curl-7.43.0.tar.gz
step1:  make cleanstep2:  ./configure --host=arm-linux-gnueabihf --prefix=/usr/local/tools/curlstep3:  makestep4:  make install

3>> openssl: http://www.openssl.org/source/ openssl-1.0.1p.tar.gz
step1: ./config no-asm shared --prefix=/usr/local/tools/opensslstep2:  a、修改Makefile CC=arm-linux-gnueabihf-gcc
           b、找到有-m64的地方,将-m64删除。  
step3: makestep4: make install 查看全部
一、交叉编译

在一个平台上生成另一个平台上的可执行代码。为什么要大费周折的进行交叉编译呢?一句话:不得已而为之。有时是因为目的平台上不允许或不能够安装所需要的编译器,而又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行所需要的编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。

要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译源代码,最终生成可在目标平台上运行的代码。     
常见的交叉编译例子如下:
  1. 在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。
  2. 在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。
  3. 在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。

 
二、名词解释
 
Linux下的大多数软件包都使用Autoconf/Automake工具自动生成Makefile,只要使用“./configure”,“make”,“make install”就可以把程序安装到Linux系统中去了。编译第三方源代码时,可以看下工程中的readme和install文件,一般情况下都会写编译步骤。
 
 1、./configure 常用参数  [--build] | [--host] | [--target] | [--prefix] | [--help]

注意:host和--host不是一个意思,host是指宿主机,即编辑和编译程序的平台,是个名词;--host是设置执行文件所运行的主机,是个动词。
 
>> ./configure: 用来生成对应的 Makefile;
 
>> --build: 执行代码编译的主机,正常的话就是你的主机系统。若无指定使用host的值;
>> --host: 编译出来的二进制程序所执行的主机, 交叉编译工具链的前缀。因为绝大多数是如果本机编译就本机执行,所以这个值就等于build。但是交叉编译的时候build和host需要设置不同值,用host指定运行主机,即host != build的时候编译才是交叉编译。若无指定将会运行`config.guess'来检测;
 
>> --prefix: 安装目录,比如 --prefix=/usr 意思是将该软件安装在 /usr 下面,执行文件就会安装在 /usr/bin (而不是默认的 /usr/local/bin),资源文件就会安装在 /usr/share(而不是默认的/usr/local/share);
 
>> --help: 查看参数;
 
>> --target: 这个参数比较特殊,表示需要处理的目标平台名称,主要在程序语言工具如编译器和汇编器上下文中起作用,若无指定使用host的值。一般用来编译工具,比如给arm开发板编译一个可以处理mips程序的gcc,那么--target=mips;
 
>>>> 举例说明:编译gcc
 
>> ./configure --build=i386-linux --host=arm-linux --target=mipsel-linux --prefix=$(pwd)/_install
 
用i386-linux的编译器进行gcc的编译,编译出的gcc运行在arm-linux, 编译结果存放到$(pwd)/_install路径下,编译出的gcc用来编译能够在mipsel-linux下运行的代码。
 
2、Makefile包含了一些基本的预先定义的操作: 
  • >>make: 根据Makefile编译源代码,连接,生成目标文件,可执行文件;
  • >>make clean: 清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件;
  • >>make distclean: 类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile;
  • >>make test / make check: 检查make,确保make没有出错,一般在make install之前执行;
  • >>make install: 将编译成功的可执行文件安装到指定目录中,一般为/usr/local/bin目录;
  • >>make dist: 产生发布软件包文件(即distribution package)。这个命令将会将可执行文件及相关文件打包成一个tar.gz压缩的文件用来作为发布软件的软件包。它会在当前目录下生成一个名字类似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我们在configure.in中定义的AM_INIT_AUTOMAKE(PACKAGE, VERSION);
  • >>make distcheck: 生成发布软件包并对其进行测试检查,以确定发布包的正确性。这个操作将自动把压缩包文件解开,然后执行configure命令,并且执行make,来确认编译不出现错误,最后提示你软件包已经准备好,可以发布了; 


三、交叉编译源代码

1、环境
Ubuntu
 
2、树莓派交叉编译工具安装step
 
  • step1.下载树莓派交叉编译工具https://github.com/raspberrypi/tools
  • step2. 将源码放到各用户都能share的文件夹下,如/usr/tools
  • step3. 将交叉编译工具的路径加到环境变量中,为了以后启动不用再设置,我加到了bashrc中

1 $nano ~/.bashrc
2 #在文件的末尾加上: export PATH=$PATH:/usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
3 $source .bashrc

  • step4. 检测是否安装成功

way1: 
$arm #双tab
显示以下内容

031616177676048.jpg

 
way2:
$arm-linux-gnueabihf-gcc -v 
#能显示正确信息

$arm-linux-gnueabihf-g++ -v
#能显示正确信息
注意:交叉编译时,如果出现arm-linux-gnueabihf-XXX找不到,确定arm-linux-gnueabihf-XXX -v 是否能输出正确信息,如果能,可以切到root下进行编译

三、编译源代码

1、在写编译脚本时,一定要确保编译器写的是交叉编译的编译器。比如比较常用的Makefile,
1 demo: $(obj)
2 $(CXX) -o $@ $^ $(LDFLAGS)
其中的CXX必须是arm-linux-gnueabihf-g++才能编译出正确的在树莓派上的可执行文件。

2、编译第三方库

如果你想设置全局的CC和CXX变量,在每次打开一个新的Terminal时,输入以下命令:
1 $export CC=arm-linux-gnueabihf-gcc  
2 $export CXX=arm-linux-gnueabihf-g++
其他的全局变量同上。

以下列几个常用的第三方库交叉编译步骤

1>> sqlite3 http://www.sqlite.org/download.html sqlite-autoconf-3081002.tar.gz
  • step1:  make clean
  • step2:  ./configure --host=arm-linux-gnueabihf --prefix=/usr/local/tools/sqlite3
  • step3:  make
  • step4:  make install


 

2>>curl http://curl.haxx.se/download.html  curl-7.43.0.tar.gz
  • step1:  make clean
  • step2:  ./configure --host=arm-linux-gnueabihf --prefix=/usr/local/tools/curl
  • step3:  make
  • step4:  make install


3>> openssl: http://www.openssl.org/source/ openssl-1.0.1p.tar.gz
  • step1: ./config no-asm shared --prefix=/usr/local/tools/openssl
  • step2:  a、修改Makefile CC=arm-linux-gnueabihf-gcc

           b、找到有-m64的地方,将-m64删除。  
  • step3: make
  • step4: make install

2
最佳

在WebIM中获取离线消息怎么写? 环信_WebIM

beyond 回复了问题 • 3 人关注 • 1533 次浏览 • 2015-08-04 12:59 • 来自相关话题

0
回复

腾讯云开放QQ IM 的能力对外免费服务对家有谁用过吗?腾讯能有优势吗? IM

回复

yongqunxu 发起了问题 • 1 人关注 • 2919 次浏览 • 2015-08-04 11:50 • 来自相关话题

2
回复

凡信能实现跟环信进行通信吗? 环信_Android 凡信

zhangnan 回复了问题 • 3 人关注 • 1366 次浏览 • 2015-08-04 11:25 • 来自相关话题

3
回复

注册新用户报错 环信_Android

梦让我心飞翔 回复了问题 • 2 人关注 • 1517 次浏览 • 2015-08-04 11:01 • 来自相关话题

1
回复

加入公开群抛出异常,在线等 环信技术支持 环信_Android

zhangnan 回复了问题 • 2 人关注 • 1257 次浏览 • 2015-08-04 10:18 • 来自相关话题

1
回复

好友添加问题 环信_Android 环信技术支持

zhangnan 回复了问题 • 2 人关注 • 694 次浏览 • 2015-08-04 10:15 • 来自相关话题

1
回复

环信群发消息 环信技术支持 环信_RestAPI 群发

lizg 回复了问题 • 2 人关注 • 2334 次浏览 • 2015-08-04 10:12 • 来自相关话题

3
回复

集成环信 注册网络连接监总是报错 -1001 网络不可用 环信_Android

环信技术支持中心 回复了问题 • 2 人关注 • 1057 次浏览 • 2015-08-03 19:12 • 来自相关话题

1
回复

android发送图片问题 Android

zhangnan 回复了问题 • 2 人关注 • 1211 次浏览 • 2015-08-03 19:11 • 来自相关话题

7
最佳

环信iOS UI集成按照官方的方法集成不行了 环信_iOS 环信技术支持

lizg 回复了问题 • 4 人关注 • 1902 次浏览 • 2015-08-03 18:52 • 来自相关话题

4
回复

android sdk 下载不了 环信技术支持

winneryong 回复了问题 • 2 人关注 • 1597 次浏览 • 2015-08-03 16:34 • 来自相关话题

2
回复

IOS 环信SDK 怎么关闭后台打印,即关闭debug模式,要上线了应用,急!!! 环信_iOS

我把我留在了西塘 回复了问题 • 2 人关注 • 2380 次浏览 • 2015-08-03 15:41 • 来自相关话题