交叉编译几种常见的报错
gdb交叉编译

gdb交叉编译gdb交叉编译⽹上有很多教程,在编译时,会碰到⼀条错误:configure: error: no termcap library found⼀般的解决是下载termcap代码,然后编译成⽬标系统的lib,放⼊⽬标系统编译环境中,但是——————有时候发现这样做上⾯的错误提⽰还在,原因是,还要把ncurses源码下载下来,和termcap⼀样,编译成⽬标系统的lib,放⼊。
,然后才⾏。
(这句话是我花了4个晚上才搞定的,看到的同学要珍惜);==================================附上编译的⼀些步骤======================编译tercap: 以arm-linux为例:./configure --host=arm-linux CC=arm-linux-gcc编译出来后,.h,.a⽂件放⼊编译环境中,编译环境⽤这个命令查找: arm-linux-gcc --print-file-name libc.a ,⽐如我的环境:/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi//sys-root/usr/编译ncurses:./configure --host=arm-linux CC=arm-linux-gcc --prefix=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/usr/makemake install编译gdb-7.4./configure --host=arm-linux --prefix="$PWD/../gdb" --without-x --disable-gdbtk --disable-tui --without-included-regex --without-included-gettext CC=arm-linux-gccmake,即可看见令⼈感动的success!。
交叉编译环境以及开发板上-binsh:.hello:notfound(使用arm-linu。。。

交叉编译环境以及开发板上-binsh:.hello:notfound(使⽤arm-linu。
⽬标板是S3C2440.⾄于交叉编译环境的搭建就不多说了,⽹上很多教程.搭建好了交叉编译环境后,第⼀件事就是传说中的”Hello,World!”.⼀. 主机编译环节我使⽤的系统是ubuntu10.04,搭建好交叉编译环境后,终端输⼊arm-linux-gcc -v能够正常显⽰版本信息,但是输⼊sudo arm-linux-gcc -v后却显⽰命令⽆法找到.我试过很多种⽅法,⽐如sudo -s切换到root后,编辑$PATH,将编译器路径加⼊.然后exit到普通⽤户.仍然不能执⾏sudo arm-linux-gcc -v. 这⾥如果哪位⼤⽜知道是什么原因的可以留⾔告诉我,谢谢:)由于编译.c的⽂件后,要产⽣新的⽂件,因此要super的权限.⼜不能使⽤sudo arm-linux-gcc,于是可以先sudo -s到root⽤户,再使⽤arm-liunux-gcc来进⾏编译.⼆. ⽬标板执⾏环节我是使⽤FTP在主机和⽬标板之间传送⽂件.传送过去后要注意改变权限.这⾥要注意⼏点:1. 要确定ftp过来后的⽂件的默认的存放路径.这个只要在⽬标机的终端机上确认下即可.(这个地⽅没有确认可能就会显⽰找不到命令)2. 传送过来的⽂件要更改权限才能运⾏.可以⽤:chmod 777 hellochmod +x hello3. 执⾏./hello这时,报错:-/bin/sh: ./hello: not found三. 问题排除⽤过绝对路径也试过之后就确定并不是⽂件是否存在的问题,⽽是这个⽂件并不能被执⾏.GOOGLE之后可以发现,排除上⾯提到问题后,就将问题定位到动态链接库上.于是在主机上⽤arm-linux-gcc -static -o 来进⾏静态编译.然后将新产⽣的⽂件传到⽬标板上.可以发现通过静态编译的⽂件明显⽐动态编译的要⼤.然后再次执⾏./hello 可以看到屏幕上出现了久违的Hello,World!问题到这⾥还没有完,我们可以再思考下怎么彻底解决,⽽不是每次都使⽤静态编译.既然是动态库引起的问题,那么应该和编译器的版本有关.在安装编译环境的时候同时安装了3.4.1和4.3.3两个版本.⽤户⼿册上说其中3.4.1是⽤来编译u-boot的,4.3.3版本是⽤来编译Linux内核和Qtipia的,两个版本均可以⽤来编译应⽤程序.既然我们的内核使⽤4.3.3编译的,⽽我们刚才编译hello是使⽤3.4.1编译的,那么会不会是这个原因呢?于是我们试⼀下,将$PATH中的原来包含3.4.1/bin 的路径改为 4.4.3/bin . 修改的⽅法⽹上有很多.(直接export PATH=”想要的路径”)再次编译,下载.⽬标板上执⾏,成功显⽰”Hello,World!”.可以看到系统中动态库的⽀持和编译器还是有关的./lzjsky/p/3730183.html。
ARM-linux-gcc交叉编译工具提示arm-linux-gcccannotfind

ARM-linux-gcc交叉编译工具提示arm-linux-
gcccannotfind
ARM-linux-gcc 交叉编译工具提示arm-linux-gcc can not
find
在Ubuntu12.04 下安装了arm-linux-gcc 后,编译Linux 内核发现提示arm-linux-gcc can not find,查找了相关的网络资料找到了答案。
一:1:常规下,在用户目录下执行交叉工具的解压安装,2:并用sudo /etc/profile 更改相应的环境变量。
(相关查看OK6410Llinux 用户手册的交叉工具安装)
3:source /etc/profile 使修改的文件生效
4:查看交叉工具是否生效:arm-linux-gcc-V
以上提示你安装的交叉工具链的把版本信息,但是你编译内核时,系统
会提示错误某些文件不能执行,于是就加上了sudo,试图通过sudo权
限能编译通过,结构不行提示arm-linux-gcc can not find,....怎么啦?咋回事
解决方式如下:
A:sudo -s命令,这是Ubuntu切换到Root权限的命令
B:vi /etc/profile 命令,你会发现这个并不是上一大步修改的文件吗?是的就是你在用户权限下用sudo vi /etc/profile 修改并保存的东西,这里我们不用再次修改了。
因为关键在下面的第3 点C:source /etc/profile。
D:查看交叉工具是否生效:arm-linux-gcc-v
E:编译你的文件,发现工具好用,不会提示错误。
编译器设计难点

现代编译器的设计及其难点摘要:我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。
在现代计算机系统中,编译器的设计始终都是一个重点与难点。
此文主要介绍了编译器的设计方法,交叉编译的诞生及其应用。
关键词:代码、编译器、交叉编译。
导论:首先谈谈编译器的主要功能及其设计步骤,然后对主机编译器进行研究,具体分析设计步骤,思考什么时候要用到交叉编译。
回顾:编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低级机器语言的程序。
编译器将原始程序(Source program)作为输入,翻译产生使用目标语言(Target language)的等价程序。
编译程序完成从源程序到目标程序的翻译工作,是一个复杂的整体的过程。
一个现代编译器的主要工作流程如下:源程序(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→连接器(链接器,Linker)→可执行程序(executables)。
从概念上来讲,一个编译程序的整个工作过程是划分成阶段进行的,每个阶段将源程序的一种表示形式转换成另一种表示形式,各个阶段进行的操作在逻辑上是紧密连接在一起的。
一般一个编译过程划分成词法分析、语法分析、语义分析、中间代码生成,代码优化和目标代码生成六个阶段,这是一种典型的划分方法(如图1)。
图1但有的目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;或者目标平台上的资源贫乏,无法运行我们所需要编译器,此时就需要用到交叉编译。
什么是交叉编译呢,简单地说,就是在一个平台上生成另一个平台上的可执行代码。
这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。
C++常见的编译错误中英对应翻译

C++常见的编译错误中英对应翻译对于刚学编程,刚接触C++的新手来说,编译运行报错是最头疼的一件事,爆出一堆英文,英语差一点的又不知道什么意思,所以也不知道如何去改,在此,我给大家传一份常见错误中英文对照表及简单解释,希望可以帮到大家:fatal error C1003: error count exceeds number; stopping compilation中文对照:(编译错误)错误太多,停止编译分析:修改之前的错误,再次编译fatal error C1004: unexpected end of file found中文对照:(编译错误)文件未结束分析:一个函数或者一个结构定义缺少“}”、或者在一个函数调用或表达式中括号没有配对出现、或者注释符“/*…*/”不完整等fatal error C1083: Cannot open include file: 'xxx': No such file or directory中文对照:(编译错误)无法打开头文件xxx:没有这个文件或路径分析:头文件不存在、或者头文件拼写错误、或者文件为只读fatal error C1903: unable to recover from previous error(s); stopping compilation中文对照:(编译错误)无法从之前的错误中恢复,停止编译分析:引起错误的原因很多,建议先修改之前的错误error C2001: newline in constant中文对照:(编译错误)常量中创建新行分析:字符串常量多行书写error C2006: #include expected a filename, found 'identifier'中文对照:(编译错误)#include命令中需要文件名分析:一般是头文件未用一对双引号或尖括号括起来,例如“#include stdio.h”error C2007: #define syntax中文对照:(编译错误)#define语法错误分析:例如“#define”后缺少宏名,例如“#define”error C2008: 'xxx' : unexpected in macro definition中文对照:(编译错误)宏定义时出现了意外的xxx分析:宏定义时宏名与替换串之间应有空格,例如“#define TRUE"1"”error C2009: reuse of macro formal 'identifier'中文对照:(编译错误)带参宏的形式参数重复使用分析:宏定义如有参数不能重名,例如“#define s(a,a) (a*a)”中参数a重复error C2010: 'character' : unexpected in macro formal parameter list中文对照:(编译错误)带参宏的形式参数表中出现未知字符分析:例如“#define s(r|) r*r”中参数多了一个字符‘|’error C2014: preprocessor command must start as first nonwhite space中文对照:(编译错误)预处理命令前面只允许空格分析:每一条预处理命令都应独占一行,不应出现其他非空格字符error C2015: too many characters in constant中文对照:(编译错误)常量中包含多个字符分析:字符型常量的单引号中只能有一个字符,或是以“\”开始的一个转义字符,例如“char error = 'error';”error C2017: illegal escape sequence中文对照:(编译错误)转义字符非法分析:一般是转义字符位于' ' 或" " 之外,例如“char error = ' '\n;”error C2018: unknown character '0xhh'中文对照:(编译错误)未知的字符0xhh分析:一般是输入了中文标点符号,例如“char error = 'E';”中“;”为中文标点符号error C2019: expected preprocessor directive, found 'character'中文对照:(编译错误)期待预处理命令,但有无效字符分析:一般是预处理命令的#号后误输入其他无效字符,例如“#!define TRUE 1”error C2021: expected exponent value, not 'character'中文对照:(编译错误)期待指数值,不能是字符分析:一般是浮点数的指数表示形式有误,例如123.456Eerror C2039: 'identifier1' : is not a member of 'identifier2'中文对照:(编译错误)标识符1不是标识符2的成员分析:程序错误地调用或引用结构体、共用体、类的成员error C2041: illegal digit 'x' for base 'n'中文对照:(编译错误)对于n进制来说数字x非法分析:一般是八进制或十六进制数表示错误,例如“int i = 081;”语句中数字‘8’不是八进制的基数error C2048: more than one default中文对照:(编译错误)default语句多于一个分析:switch语句中只能有一个default,删去多余的defaulterror C2050: switch expression not integral中文对照:(编译错误)switch表达式不是整型的分析:switch表达式必须是整型(或字符型),例如“switch ("a")”中表达式为字符串,这是非法的error C2051: case expression not constant中文对照:(编译错误)case表达式不是常量分析:case表达式应为常量表达式,例如“case "a"”中“"a"”为字符串,这是非法的error C2052: 'type' : illegal type for case expression中文对照:(编译错误)case表达式类型非法分析:case表达式必须是一个整型常量(包括字符型)error C2057: expected constant expression中文对照:(编译错误)期待常量表达式分析:一般是定义数组时数组长度为变量,例如“int n=10; int a[n];”中n为变量,这是非法的error C2058: constant expression is not integral中文对照:(编译错误)常量表达式不是整数分析:一般是定义数组时数组长度不是整型常量error C2059: syntax error : 'xxx'中文对照:(编译错误)‘xxx’语法错误分析:引起错误的原因很多,可能多加或少加了符号xxxerror C2064: term does not evaluate to a function中文对照:(编译错误)无法识别函数语言分析:1、函数参数有误,表达式可能不正确,例如“sqrt(s(s-a)(s-b)(s-c));”中表达式不正确2、变量与函数重名或该标识符不是函数,例如“int i,j; j=i();”中i不是函数error C2065: 'xxx' : undeclared identifier中文对照:(编译错误)未定义的标识符xxx分析:1、如果xxx为cout、cin、scanf、printf、sqrt等,则程序中包含头文件有误2、未定义变量、数组、函数原型等,注意拼写错误或区分大小写。
关于在ubuntu16.0464位系统上安装交叉编译工具出现错误的解决方法

关于在ubuntu16.0464位系统上安装交叉编译工具出现错误的解决方法https:///hanshengfei/article/details/78702436 utm_source=app一.安装交叉编译工具详细的安装过程请移步我的另外一个帖子:/hanshengfei/article/details/78669298 二。
安装之后执行命令 arm-linux-gcc -v出现找不到编译工具原因是交叉编译工具是32 位的但是咱们的系统是64位的这就需要下载安装一下32位的兼容库,但是ubuntu16.04已经不支持ia32-libs的软件包,而是使用了lib32ncurses5 和lib32z1软件包做替换,所以我们应该在ubuntu16.04版本中执行:(安装的时候最好先执行一下 sudo get-apt update 更新一下软件包,否则可能会出现Unable to locate package的错误)sudo apt-get install lib32ncurses5sudo apt-get install lib32z1安装完之后再执行一下命令 arm-linux-gcc -v 就可以了三.安装完之后写个小程序来测试一下vi hello.c1.#include <stdio.h>2.int main()3.{4.printf("hello linux!!\n");5.reurn 06.}保存编译:arm-linux-gcc -o hello hello.c这个时候出现:这是说找不到这个库那么安装一下这个库:sudo apt-get install lib32stdc++6安装之后再执行命令 arm-linux-gcc -o hello hello.c出现可执行文件。
交叉编译几种常见的报错

交叉编译几种常见的报错由于是第一次交叉编译,不知道会出现什么问题,思路就是先把gcc和ld都改成arm的,然后遇到什么问题在解决什么问题,以下过程都是在这个思路下进行。
1.指定arm的编译器和连接器:只是把gcc改为arm-none-linux-gnueabi-gcc,ld改为arm-none-linux-gnueabi-ld,其他的都没有修改。
出现以下错误:arm-none-linux-gnueabi-ld: warning:library search path "/usr/local/lib" isunsafe for cross-compilationarm-none-linux-gnueabi-ld: skippingincompatible /usr/local/lib/libfreetype.sowhen searching for -lfreetypearm-none-linux-gnueabi-ld: skippingincompatible /usr/local/lib/libfreetype.awhen searching for -lfreetypearm-none-linux-gnueabi-ld: cannotfind -lfreetype分析原因是:链接的这些库文件都是在PC编译器下编译出来的,现在把它们和用arm-none-linux-gnueabi-gcc编译出来的文件做链接,当然会出错。
解决方法:这些库重新用arm-gcc重新编译生成相应的库。
下面使用是重新编译库文件的过程:重新编译freetype根据交叉编译的文档,我创建了一个文件夹/usr/local/arm-linux 来存放编译后的库文件。
执行:./configure –host=arm-none-linux-gnueabi –prefix=/usr/local/arm-linux注意:host的参数应该是交叉编译环境的前缀。
交叉编译gdb

2、unknown tFra bibliotekpe name 'sim_cpu' ......
在sim/aarch64/cpustate.h文件中倒入头文件
#include "sim-base.h"
3、报错
arm-linux-nat.c:92:19: error: 'PT_GETFPREGS' undeclared (first use in this function)
#define PT_GETEVENTMSG PTRACE_GETEVENTMSG
#define PT_GETSIGINFO PTRACE_GETSIGINFO
#define PT_SETSIGINFO PTRACE_SETSIGINFO
4、
-MF .deps/linux-thread-db.Tpo linux-thread-db.c
complete.c:2059: error: undefined reference to 'setpwent'
collect2: error: ld returned 1 exit status
修改complete.c 对应行
改为:
#if defined (HAVE_GETPWENT)
ret = ptrace (PT_GETFPREGS, tid, 0, fp);
修改 交叉编译环境中的ptrace.h文件,加入以下几行(应该只需要加对应行,但以防万一全加):
/* glibc exports a different set of PT_ names too... */
#define PT_GETFPREGS PTRACE_GETFPREGS
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
交叉编译几种常见的报错
由于是第一次交叉编译,不知道会出现什么问题,思路就是先把gcc和ld都改成arm的,然后遇到什么问题在解决什么问题,以下过程都是在这个思路下进行。
1.指定arm的编译器和连接器:
只是把gcc改为arm-none-linux-gnueabi-gcc,ld改为arm-none-linux-gnueabi-ld,其他的都没有
修改。
出现以下错误:
arm-none-linux-gnueabi-ld: warning: library search path "/usr/local/lib" is unsafe for
cross-compilation
arm-none-linux-gnueabi-ld: skipping incompatible /usr/local/lib/libfreetype.so when searching
for -lfreetype
arm-none-linux-gnueabi-ld: skipping incompatible /usr/local/lib/libfreetype.a when searching
for -lfreetype
arm-none-linux-gnueabi-ld: cannot find -lfreetype
分析原因是:链接的这些库文件都是在PC编译器下编译出来的,现在把它们和用arm-none-linux-gnueabi-gcc编译出来的文件做链接,当然会出错。
解决方法:这些库重新用arm-gcc重新编译生成相应的库。
下面使用是重新编译库文件的过程:
重新编译freetype
根据交叉编译的文档,我创建了一个文件夹/usr/local/arm-linux来存放编译后的库文件。
执行:
./configure –host=arm-none-linux-gnueabi –prefix=/usr/local/arm-linux
注意:host的参数应该是交叉编译环境的前缀。
另外,freetype自动生成的include文件夹有点小问题,编译完成后的include目录结构是
/include/ft2build.h和
/include/freetype2/freetype/***.h如果直接使用会出现头文件找不到的问题,这里涉及到freetype 的一个小技巧:使用freetype时只需要包含ft2build.h这一个头文件即可,因为ft2build.h里面会自动包含其他需要的头文件。
而ft2build.h中的包含其他头文件的路径是/freetype/***.h,显然找不到相应的头文件。
我们把freetype2中的freetype文件整个拷贝到include目录下,然后把
freetype2删除即可。
原目录结构:
…/include/freetype2/freetype/***.h
…/include/ft2build.h
修改以后是:
…/include/freetype/***.h
…/include/ft2build.h
如果安装完成后直接就是后面这个目录结构就不用修改了。
或者在编译时直接使用-I再加一个头
文件的目录。
-I/…/include/freetype2
使用arm编译器和使用pc上的编译器编译过程差不多,需要注意的是我们需要重新指定路径以
免把原来的库文件覆盖掉。
2.在编译时出现这种错误:
解决上面的问题之后,再次编译,出现以下错误:
/usr/local/arm-2009q1/bin/../arm-none-linux-gnueabi/libc/usr/include/sys/types.h:62: error:
conflicting types for ‘dev_t’
/usr/local/arm-2009q1/bin/../arm-none-linux-gnueabi/libc/usr/include/linux/types.h:13: error:
previous declaration of ‘dev_t’ was here
开始以为是编译器自动寻找types.h文件然后自动包含进来了,后来所有的都头文件删除,然后每加一个头文件进来就编译看看是否出现错误,后来发现这个我的交叉编译器对于某些头文件的
使用顺序有要求。
例如:
#include <fcntl.h>
#include <linux/fb.h>
#include <linux/fb.h>
#include <fcntl.h>
第一种编译没有问题,第二种会出现上面的错误。
而这两种写法在PC的gcc上都没有错误。
我的交叉编译器版本:gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203)
感觉这个问题是由于pc上的gcc和交叉编译使用的gcc的行为不同才导致的。
3.链接时这样的错误:
arm-none-linux-gnueabi-ld main.o es_run_file.o es_fbctl.o es_time.o es_sql.o es_fbio.o
es_dao.o es_utf8.o es_copy.o es_font.o -o main -L/usr/local/arm-linux/lib -lfreetype -lpthread
-lsqlite3 -lncurses
arm-none-linux-gnueabi-ld: warning: cannot find entry symbol _start; defaulting to 00009050
es_copy.o: In func tion `file_exist’:
/root/work/es_copy.c:32: undefined reference to `stat’
最后一个错误是找不到stat,我把es_copy.c文件单独拿出来修改以后编译:
arm-none-linux-gnueabi-gcc es_copy.c
没有错误。
把Makefile里的连接器也改成arm-none-linux-gnueabi-gcc,以上两个问题都消失了。
这个问题在gcc和arm-none-linux-gnueabi-gcc这两种编译器中都存在,应该链接时ld的参数
设置不对,具体怎样设置还是没有找到。
总结:交叉编译的一般过程
1.交叉编译并安装使用到的共享库。
2.交叉编译源程序。
3.调试。