现在换一个iphone2017苹果6s过时了吗吗?

博客访问: 18511
博文数量: 6
博客积分: 0
博客等级: 民兵
技术积分: 60
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
64位Linux系统在gcc编译时默认是生成64位的程序或库。
首先编写一个简单的程序:
#include "test.h"
int main()
&&&&int a, b;
&&&&add(a,b);
&&&&return 0;
#include "test.h"
int add(int a, int b)
&&&&return (a+b);
#ifndef _TEST_H_
#define _TEST_H_
int add(int, int);
main:libtest.so
&&&&gcc main.c -L./ -o main -ltest
libtest.so:test.c test.h
&&&&gcc -shared -fPIC test.c -o libtest.so
&&&&rm -f libtest.so main
在Linux终端直接 make,结果正确,生成了程序:
gcc -shared -fPIC test.c -o libtest.so
gcc main.c -L./ -o main -ltest
libtest.so
现在,把Makefile中的内容改一改:
main:libtest.so
&&&&&&&&gcc main.c -L./ -o main -ltest
libtest.so:test.c test.h
&&&&&&&&gcc -m32 -shared -fPIC test.c -o libtest.so
&&&&&&&&rm -f libtest.so main
再 make,就会出现下面的错误:
gcc -m32 -shared -fPIC test.c -o libtest.so
gcc main.c -L./ -o main -ltest
/usr/bin/ld: skipping incompatible .//libtest.so when searching for -ltest
/usr/bin/ld: cannot find -ltest
collect2: ld returned 1 exit status
make: *** [main] Error 1
由于在编译生成 libtest.so 时增加了 -m32 这个参数,导致 libtest.so 是一个 32 位的动态库,而链拉步骤没有改,还是按照64位进行编译,结果就导致了上面的错误,看一下 libtest.so 的文件类型:
file libtest.so
libtest.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=0xc19c3e4e4c65e76c8b838e3dcc2507, not stripped
现在再把 Makefile改动一下:
main:libtest.so
&&&&&&&&gcc -m32 main.c -L./ -o main -ltest
libtest.so:test.c test.h
&&&&&&&&gcc -m32 -shared -fPIC test.c -o libtest.so
&&&&&&&&rm -f libtest.so main
两个步骤都加入了 -m32 这个参数,再编译:
0@lhn:tmp]$ make
gcc -m32 -shared -fPIC test.c -o libtest.so
gcc -m32 main.c -L./ -o main -ltest
0@lhn:tmp]$ ls
libtest.so
0@lhn:tmp]$ file libtest.so main
libtest.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=0xc19c3e4e4c65e76c8b838e3dcc2507, not stripped
main: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xf44ed317c9ce008d93ea770aeb0a1, not stripped
编译成功,而且最终结果也是32位的程序.
由此可见,只要在gcc编译时加入 -m32(或者-m64)就可以影响生成的程序类型.这里看似很简单.但我这里前期已经做了一些必要的准备工作,因此看起来简单.
因为有时候用户系统是64位的,但只提供了32位的库,因此知道如何在64位机上编译32位程序就很必要.
在64位机上编译32位的程序首先需要 ia32-libs 这个动态的支持,看一下 /usr/lib32 这个目录下有没有东西,如果没有, Ubuntu上安装这个包:
sudo apt-get install ia32-libs ia32-libs-multiarch
如果在加入 -m32 这个参数时编译仍然有问题,比如
In file included from /usr/include/stdio.h:28:0,
from AVAPIs_Client.c:1:
/usr/include/features.h:324:26: fatal error:bits/predefs.h: No such file or directory compilation terminated.
make: *** [all] Error 1
这通常是由于没有32位的编译工具引起, 需要安装 gcc-multilib 这个软件包,在Ubuntu 上安装这个软件包:
sudo apt-get install gcc-multilib
g++ 也同样如此
sudo apt-get install g++-multilib
到这里,编译32位程序应该没有问题了,运行程序的时候记得修改 LD_LIBRARY_PATH 这个变量,否则程序会找不到指定的动态库.
export LD_LIBRARY_PATH=/home/user/lib/:$LD_LIBRARY_PATH
阅读(3740) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。64位UBUNTU 下 如何用GCC 编译出32位程序 求前辈指点!!!_ubuntu吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:103,185贴子:
64位UBUNTU 下 如何用GCC 编译出32位程序 求前辈指点!!!收藏
因学习需要。。。试过 加 -m32但是会报错 信息如下:In file included from /usr/include/stdio.h:27:0,
from a.c:1:/usr/include/features.h:374:25: fatal error: sys/cdefs.h: 没有那个文件或目录 #
include &sys/cdefs.h&求前辈知道
文档翻译,年终钜惠!注册就送268元体验金!
vmware workstantion或者virtualbox加32bit的ubuntu。
目测是32位的搜索路径下没有sys/cdefs.h一般64位系统最好不要安装32位库的-dev,经常有冲突,强行安装会破坏64位环境,头文件并不像共享库分得那么完美。我觉得比较好的做法是,重新把某一个文件夹当成rootfs,在里面安装各种32位的库和库-dev,然后给gcc传递参数"--sysroot=路径"就可以让gcc重新选取那个文件夹为rootfs,而不再认为/为rootfs。其实这样就变成交叉编译了。也可以在这个rootfs中安装32位的必要软件包如bash,gcc,coreutils等等,然后chroot进去就变成host编译了。其实有个比较简单的方法,就是虚拟机下安一个32位的ubuntu,然后装好各种软件包,然后直接对/打包,再拿出来解压就是rootfs了,后面最多就是缺啥安啥,工作量比较小。当然如果你不在意编译速度,直接虚拟机下编最简单
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或64位linux下面的GCC怎么编译出一个32位可执行程序 - Linux/Unix当前位置:& &&&64位linux下面的GCC怎么编译出一个32位可执行程序64位linux下面的GCC怎么编译出一个32位可执行程序&&网友分享于:&&浏览:116次64位linux下面的GCC如何编译出一个32位可执行程序?windows64位服务器上面安装VS,可以编译32位/64位的代码。那么在64位的linux上面:(1)可以编译出32位代码么?(2)可以运行32位程序么?------解决方案--------------------
试试 gcc -m32 ..
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有4493人阅读
Linux(21)
编译64位程序,不一定要编译机器是64位的,但是32位机器默认安装的gcc编译环境还是不能用来编译64位程序。
编译64位程序,需要加上-m64编译器参数,默认安装的gcc已经支持该参数,但是缺少64位机器指令相关的文件,所以不能编译,会出现下面的错误
In file included from /usr/include/features.h:378,
from /usr/include/assert.h:37,
from ../../../include/tinyxml/tinystr.h:42,
from ../../../src/tinyxml/tinystr.cpp:32:
/usr/include/gnu/stubs.h:9:27: error: gnu/stubs-64.h: 没有那个文件或目录
这时候需要安装 gcc所有支持文件 sudo apt-get install gcc-multilib
将会安装下列额外的软件包:
cpp-4.4 g++-4.4 gcc-4.4 gcc-4.4-base gcc-4.4-multilib lib64gcc1 lib64gomp1 libc6-amd64 libc6-dev-amd64 libgcc1 libgomp1
libstdc++6 libstdc++6-4.4-dev
建议安装的软件包:
gcc-4.4-locales g++-4.4-multilib gcc-4.4-doc libstdc++6-4.4-dbg libmudflap0-4.4-dev libgcc1-dbg libgomp1-dbg libmudflap0-dbg
libcloog-ppl0 libppl-c2 libppl7 lib64mudflap0 libstdc++6-4.4-doc
下列【新】软件包将被安装:
gcc-4.4-multilib gcc-multilib lib64gcc1 lib64gomp1 libc6-amd64 libc6-dev-amd64
下列软件包将被升级:
cpp-4.4 g++-4.4 gcc-4.4 gcc-4.4-base libgcc1 libgomp1 libstdc++6 libstdc++6-4.4-dev
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:247605次
积分:3549
积分:3549
排名:第7529名
原创:97篇
转载:26篇
评论:36条
(1)(13)(6)(1)(4)(1)(3)(2)(14)(2)(3)(2)(1)(4)(18)(14)(6)(1)(13)(2)(13)(1)

我要回帖

更多关于 iphone6s会过时吗 的文章

 

随机推荐