交叉编译几种常见的报错
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
最常见的20种VC++编译错误信息集合五篇
最常见的20种VC++编译错误信息集合五篇第一篇:最常见的20种VC++编译错误信息集合1、fatal error C1010: unexpected end of file while looking for precompiled header directive。
寻找预编译头文件路径时遇到了不该遇到的文件尾。
(一般是没有#include “stdafx.h”)2、fatal error C1083: Cannot open include file: 'R…….h': No such file or directory不能打开包含文件“R…….h”:没有这样的文件或目录。
3、error C2011: 'C……': 'class' type redefinition类“C……”重定义。
4、error C2018: unknown character '0xa3'不认识的字符'0xa3'。
(一般是汉字或中文标点符号)5、error C2057: expected constant expression希望是常量表达式。
(一般出现在switch语句的case分支中)6、error C2065: 'IDD_MYDIALOG' : undeclared identifier“IDD_MYDIALOG”:未声明过的标识符。
7、error C2082: redefinition of formal parameter 'bReset'函数参数“bReset”在函数体中重定义。
8、error C2143: syntax error: missing ':' before '{'句法错误:“{”前缺少“;”。
9、error C2146: syntax error : missing ';' before identifier 'dc'句法错误:在“dc”前丢了“;”。
交叉编译dbus模块到Qt遇到的错误及解决
交叉编译dbus模块到Qt遇到的错误及解决由于⽤qt来检测U盘插拔,要⽤dbus。
pc调试通过后,发现到板⼦⾥没有dbus。
原来默认情况下,编译arm版本qt时是不带dbus的,因此要重新交叉编译qt。
我的配置:./configure -prefix /usr/local/arm/arm2-qt-4.8.1 -opensource -embedded arm -xplatform qws/linux-arm-g++ -no-webkit -qt-libtiff -qt-libmng -qt-mouse-tslib -qt-mouse-pc -no-mouse-linuxtp -no-neon -nomake examples -nomake docs -nomake demos -nomake tools -no-qt3support -dbus版本为qt4.8.1,注意最后的“-dbus”就是让qt带dbus模块。
结果报错:The QtDBus module cannot be enabled because libdbus-1 version 0.93 was not found. 说需要⼀个libdbus-1,yum install了⼀下,发现这个东西已经安装了在pc上,否则我程序在pc下也不会跑通。
只是没有嵌⼊式版本的,需要⾃⼰⽤源码交叉编译。
我下载的dbus源码的版本是1.0.2,看到⽹上移植这个的多。
⾸先新建⼀个⽂件夹,mkdir /usr/local/arm/dbus-1.0.2,然后解压源码,进到dbus-1.0.2⽬录⾥,输⼊:./configure --host=arm-linux --prefix=/usr/local/arm/dbus-1.0.2 CC=arm-linux-gcc --cache-file=arm-linux.cache --without-x 报错:checking abstract socket namespace... configure: error: cannot run test program while cross compiling解决:1,⾸先⽤locate pkgconfig查看下pkgconfig安装了没有,⼀般都安装了。
linux during startup program exited normally 交叉编译
linux during startup program exited normally 交叉编译当你在Linux 系统中启动一个程序,而该程序在启动过程中出现"program exited normally"(程序正常退出)的消息时,这通常表示程序在启动过程中执行完毕并正常退出。
对于交叉编译的情况,有一些常见的问题可能导致程序无法正常启动。
以下是一些建议:1. 动态链接库缺失:如果程序依赖于某些动态链接库,而这些库在目标系统上不存在,程序可能无法启动。
确保你的交叉编译环境中包含目标系统所需的所有依赖项。
2. 运行权限问题:确保程序和相关文件具有执行权限。
你可以使用`chmod +x` 命令为文件添加执行权限。
```bashchmod +x your_program```3. 查看程序输出:如果程序在启动时有输出,可以查看这些输出以获取更多信息。
你可以使用输出重定向到文件,或者查看系统日志,具体取决于你的程序和系统配置。
```bash./your_program > output.log 2>&1```4. 检查交叉编译工具链:确保你使用的交叉编译工具链是正确的,与目标系统架构匹配,并且与程序的依赖项兼容。
5. 检查程序代码:仔细检查程序的源代码,确保没有硬编码的本地路径、文件名等,这可能导致在目标系统上找不到文件。
6. 静态编译:考虑使用静态编译,将所有依赖项直接嵌入到可执行文件中,以减少对目标系统的依赖。
7. 调试信息:在编译时包含调试信息,以便在程序出现问题时能够更容易地进行调试。
在GCC 中,可以使用`-g` 选项:```bashgcc -o your_program your_source.c -g```8. 交叉编译工具链版本:确保交叉编译工具链的版本与目标系统兼容。
有时,不同版本的交叉编译工具链可能导致问题。
编译时的常见错误
一、编译时的常见错误1. 数据类型错误。
此类错误是初学者编程时的常见现象, 下面是一些要引起注意的错误:(1) 所有变量和常量必须要加以说明。
(2) 变量只能赋给相同类型的数据。
(3) 对scanf()语句, 用户可能输入错误类型的数据项, 这将导致运行时出错, 并报出错信息。
为避免这样的错误出现, 你就提示用户输入正确类型的数据。
(4) 在执行算术运算时要注意:a. 根据语法规则书写双精度数字。
要写0.5, 而不是写.5; 要写1.0, 而不是1。
尽管C语言会自动地把整型转换成双精度型, 但书写双精度型是个好习惯。
让C语言为你做强行转换这是一种效率不高的程序设计风格。
这有可能导致转换产生错误。
b. 不要用0除。
这是一个灾难性的错误, 它会导致程序失败, 不管C 语言的什么版本, 都是如此, 执行除法运算要特别小心。
c. 确保所有的双精度数(包括那些程序输入用的双精度数) 是在实数范围之内。
d. 所有整数必须在整数允许的范围内。
这适用于所有计算结果, 包括中间结果。
2. 将函数后面的";"忘掉。
此时错误提示色棒将停在该语句下的一行, 并显示:Statement missing in function <函数名>3. 给宏指令如#include, #define等语句尾加了";"号。
4. "{"和"}"、"("和")"、"/*"和"*/"不匹配。
引时色棒将位于错误所在的行, 并提示出有关丢掉括号的信息。
5. 没有用#include指令说明头文件, 错误信息提示有关该函数所使用的参数未定义。
6. 使用了Turbo C保留关键字作为标识符, 此时将提示定义了太多数据类型。
7. 将定义变量语句放在了执行语句后面。
此时会提示语法错误。
8. 使用了未定义的变量, 此时屏幕显示:Undefined symbol '<变量名>' in function <函数名>9. 警告错误太多。
Cygwin下用crosstool-ng编译交叉工具链的常见错误及解决办法
Cygwin下用crosstool-ng编译交叉工具链的常见错误及解决办法Cygwin下用crosstool-ng 编译交叉工具链的常见错误及解决办法2011-02-28 21:221、配置crosstool-ng产生的错误1.1 ncurses headers files were not foundChecking for 'ncurses/ncurses.h'... noChecking for 'ncurses/curses.h'... noChecking for 'ncurses.h'... noChecking for 'curses.h'... noncurses headers files were not found解决方法:安装:ncurses,、libncurses-devel1.2 flex none foundChecking for 'flex'... Noflex: none foundEither you are missing entirely the needed tool,or the version you have is too old.configure: Bailing out...解决方法:安装:flex,flexdll1.3 automake 1.10 or above was not foundChecking for 'automake'... noautomake 1.10 or above was not foundEither you are missing entirely the needed tool,or the version you have is too old.configure: Bailing out...解决方法:安装:automake1.4 libtool 1.5.26 or above was not foundChecking for 'libtool'... nolibtool 1.5.26 or above was not foundEither you are missing entirely the needed tool,or the version you have is too old.You can give the path to this tool using: --with-libtool=PATH configure: Bailing out...解决方法:安装:libtool注:在配置crosstool-NG时,出现的类似“XXX:none found”的错误,都可以是该工具没有安装,把该工具安装上,重新配置即可。
交叉编译链注意事项
交叉编译链注意事项介绍在软件开发中,交叉编译是指在一种操作系统或硬件平台上开发出的软件能够在另一种操作系统或硬件平台上运行。
交叉编译链是用于进行交叉编译的工具链,包括编译器、链接器、调试器等工具。
本文将介绍交叉编译链的注意事项,帮助开发者更好地进行交叉编译工作。
选择合适的交叉编译链1. 考虑目标平台的架构在选择交叉编译链之前,首先要确定目标平台的架构,例如x86、ARM等。
不同的架构需要使用不同的交叉编译链。
2. 考虑目标操作系统目标操作系统也是选择交叉编译链的一个重要因素。
不同的操作系统可能有不同的系统调用、库文件等,需要选择适配目标操作系统的交叉编译链。
3. 考虑目标硬件平台如果目标平台是嵌入式系统或特定硬件平台,需要选择适配该硬件平台的交叉编译链。
这样可以确保生成的代码能够正确地运行在目标硬件上。
配置交叉编译链1. 设置环境变量在使用交叉编译链之前,需要设置相应的环境变量,以便系统能够正确地找到交叉编译链的工具。
通常需要设置以下环境变量:•PATH:将交叉编译链的工具路径添加到PATH环境变量中,以便在命令行中能够直接使用交叉编译链的工具。
•CC、CXX:设置C语言和C++语言的编译器路径,以便在编译代码时能够使用交叉编译链的编译器。
•LD:设置链接器路径,以便在链接代码时能够使用交叉编译链的链接器。
•AR:设置静态库打包工具路径,以便在生成静态库时能够使用交叉编译链的工具。
2. 配置编译选项交叉编译链通常提供了一些编译选项,用于配置编译过程中的各种参数。
开发者需要根据具体情况进行相应的配置,以确保生成的代码能够适配目标平台和操作系统。
一些常用的编译选项包括:•-march:指定目标平台的架构,例如-march=armv7-a表示目标平台为ARMv7架构。
•-mfloat-abi:指定浮点运算的ABI(Application Binary Interface),例如-mfloat-abi=hard表示使用硬件浮点运算。
嵌入式linux内核编译错误的一...
嵌入式linux内核编译错误的一些解决办法(Some solutions to compile errors in embedded Linux kernel)一:无效的选项` ABI = AAPCS Linux的选项错误脚本/ Kconfig /会议/手臂/ Kconfig的弓CHK include/linux/H版。
链接包括/ ASM臂/弓->包含/手臂/ arch-s3c2410 ASM使[ 1 ]:包含/ ASM臂/马赫类型。
检查包括/ Linux / utsrelease。
Hcc拱/臂/内核/ ASM偏移。
CC1:错误:无效的选项` ABI = Linux的特点使[ 1 ]:*** [ ARM /内核/ ASM偏移量]错误1制作:* * * [ prepare0 ]错误2解决方法:你建立一个OABI编译器的一个是核心。
你可以关掉你的配置文件是期权(核心功能->使用EABI),或者,你可以使用一个是工具如臂/ GNU Linux从<http:/ / www.codesourcery。
COM / gnu_toolchains /手臂/下载。
HTML >。
我推荐后者,因为你能跑的Arjan的新形象。
上述的关掉是选项可以通过测试二:司机/视频/游戏/ vgacon啊:987:警告:比较是真的由于数据类型范围的限制使[ 3 ]:*** [司机/视频/游戏/ vgacon O ]错误1。
使[ 2 ]:*** [司机/视频/ console2 ]错误2使[ 1 ]:*** [司机/ VIDEO1 ]错误2制造:*** [驾驶员]错误2解决方法:在menuconfig时选哪个设备驱动的选项进去在选图形支持->控制台显示驱动程序支持>文本控制台(不选这个)再编译就行了!三:` rtc_lock”未定义错误(未完全解决)方法:司机/内置。
O(文本+ 0x281e4):司机/焦炭/ NVRAM。
交叉编译几种常见的报错.doc
交叉编译几种常见的报错由于是第一次交叉编译,不知道会出现什么问题,思路就是先把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 forcross-compilationarm-none-linux-gnueabi-ld: skipping incompatible /usr/local/lib/libfreetype.so when searchingfor -lfreetypearm-none-linux-gnueabi-ld: skipping incompatible /usr/local/lib/libfreetype.a when searchingfor -lfreetypearm-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的参数应该是交叉编译环境的前缀。
Bash和Dash-在ubuntu上安装交叉编译器出错时需注意
Bash和Dash-在ubuntu上安装交叉编译器出错时需注意安装交叉编译器出问题./arm-2010q1-202-arm-none-linux-gnueabi.bin错误信息如下;Checking for required programs: awk grep sed bzip2 gunzip ====================================== =========================Error: DASH shell not supported as system shell====================================== =========================The installer has detected that your system uses the dash shellas /bin/sh. This shell is not supported by the installer.You can work around this problem by changing /bin/sh to be asymbolic link to a supported shell such as bash.For example, on Ubuntu systems, execute this shell command:% sudo dpkg-reconfigure -plow dashInstall as /bin/sh? NoPlease refer to the Getting Started guide for more information,or contact CodeSourcery Support for assistance.Google搜:Ubuntu下sh默认指向dash 。
echo $SHELL --> /bin/bashtype sh --> /bin/sh然后我到/bin下看了有"sh -> dash",原来sh是/bin/dash的链接。
CMake的交叉编译问题Linuxx86-arm11
CMake的交叉编译问题Linuxx86-arm11/cjsycyl/article/details/493345432015如果你的英文比较好,那么可以看这里:/Wiki/CMake_Cross_Compiling,这是CMake官方网站上一篇介绍如何交叉编译的文章,我也是主要参考这篇文章完成了我的交叉编译。
但是我的交叉编译过程不是翻译它的,是根据我自己交叉编译的过程,从了解CMake到完成交叉编译写的,容易入门,不涉及深入研究。
转载请注明原出处:/%E6%99%A8%E6%B1%A0/blog/item/c0199 2f9983b4e42252df227.html概念性介绍首先介绍一下CMake。
本文是针对CMake菜鸟的,所以必须先对CMake有一个大概的认识,知道这是什么、怎么用以后,才可以考虑交叉编译不是?CMake 是一个跨平台自动编译工具,在KDE等开源项目当中有很好的应用,从而证明了CMake的强大功能。
CMake的作用是根据设定的配置自动生成编译脚本,在Linux下就是生成Makefile,在Windows下就是生成VS的工程文件,这也是CMake产生的初衷和优点,使用CMake就可以为工程只写一个CMake脚本然后到各种平台上都能编译。
比如一个跨平台的工程,可以在Linux、Windows和苹果上编译,那么以前的做法就是提供三套编译脚本,Linux下就是Makefile,Windows下就是VS的工程文件,如果有修改要添加删除文件呢,也只能三个地方都修改(任何一个程序员对会对这种做法嗤之以鼻,为什么不统一到一个地方呢?),而使用了CMake以后呢,就可以仅仅修改CMake的设定,然后运行CMake,CMake会根据当前的操作系统自动生成可用的的脚本,然后该Make就Make该VS就VS吧。
具体的使用呢,如果你拿到的是一个人家已经配置好的工程,那么一般来说敲cmake,就会发现目录下面多了一个Makefile出来,这时候敲make就可以编译通过了(顺利的情况下)。
- 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.调试。