交叉编译几种常见的报错
- 格式:doc
- 大小:24.00 KB
- 文档页数:3
交叉编译环境以及开发板上-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。
关于在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出现可执行文件。
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=PATHconfigure: Bailing out...解决方法:安装:libtool注:在配置crosstool-NG时,出现的类似“XXX:none found”的错误,都可以是该工具没有安装,把该工具安装上,重新配置即可。
常见gcc 编译错误整理常见gcc 编译错误整理(开始) 11 error: expected expression before 'else' else之前无表达式。
2 error: lvalue required as left operand of assignment 左值问题。
3 error: invalid storage class for function 'XXXXXX' 在文件的某个地方,丢失了一个大括号‘}’。
常见gcc编译警告整理(开始)1、warning: no newline at end of file 在文件最后一行加上回车键解释:在《Rationale for the C99 standard》一文中,有C99的相关信息:A backslash immediately before a newline has long been used to continue string literals, as well as preprocessing command lines. In the interest of easing machine generation of C, and of transporting code to machines with restrictive physical line lengths, the C89 Committee generalized this mechanism to permit any token to be continued by interposing abackslash/newline sequence.c/c++代码的每一行后面有一个“结束符”,也就是newline。
避免当被include的文件展开后,前一个文件的最后一行与后一个文件的第一行直接被连接成一行从而造成错误。
交叉编译几种常见的报错由于是第一次交叉编译,不知道会出现什么问题,思路就是先把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的参数应该是交叉编译环境的前缀。
GCC常见错误解析一、错误类型第一类∶C语法错误错误信息∶文件source.c中第n行有语法错误(syntex errror)。
这种类型的错误,一般都是C语言的语法错误,应该仔细检查源代码文件中第n行及该行之前的程序,有时也需要对该文件所包含的头文件进行检查。
有些情况下,一个很简单的语法错误,gcc会给出一大堆错误,此时要保持清醒的头脑,不要被其吓倒,必要的时候再参考一下C语言的基本教材。
第二类∶头文件错误错误信息∶找不到头文件head.h(Can not find include file head.h)。
这类错误是源代码文件中的包含头文件有问题,可能的原因有头文件名错误、指定的头文件所在目录名错误等,也可能是错误地使用了双引号和尖括号。
第三类∶档案库错误错误信息∶连接程序找不到所需的函数库,例如∶ld: -lm: No such file or directory.这类错误是与目标文件相连接的函数库有错误,可能的原因是函数库名错误、指定的函数库所在目录名称错误等,检查的方法是使用find命令在可能的目录中寻找相应的函数库名,确定档案库及目录的名称并修改程序中及编译选项中的名称。
第四类∶未定义符号错误信息∶有未定义的符号(Undefined symbol)。
这类错误是在连接过程中出现的,可能有两种原因∶一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没有定义,这需要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中还没有给定相应的函数库的名称,或者是该档案库的目录名称有问题,这时需要使用档案库维护命令ar检查我们需要的库函数到底位于哪一个函数库中,确定之后,修改gcc 连接选项中的-l和-L项。
排除编译、连接过程中的错误,应该说这只是程序设计中最简单、最基本的一个步骤,可以说只是开了个头。
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的链接。
喜欢里面的一句词:我的快乐会回来的。
此刻,我在安装目录的bin下找到了linphonec这个可执行文件,现在就需要向老大要个板子烧上去看效果然后再进行伟大的修改工作。
这个交叉编译的过程我持续了两个星期,当然中间有放弃的阶段,转而研究josua.c这个程序,这是个依赖osip库写的一个简单应用,因为我安装的库的版本与这个程序不匹配,所以为了兼容也做了很多的工作。
老大说,你这样不行。
于是昨天下午我重新振作,换系统换交叉编译工具,汇报一下:用的是2.4.20内核,arm-linux-gcc3.4.1。
直到昨天晚上九点半,configure错误情况恢复到上个月底状态:checking eXosip2/eXosip.h usability nochecking .. presence noconfigure:error:couldn't find eXosip2 head!然后我添上了—with-osip=/work,这句话很无聊,因为我在找不到eXosip2 head之前已经checking osip的相关东西成功了,那就说明和osip相关的东西已经能够找到正确的路径链接了。
但是加上这句话确实有用,错误情况又变了:checking eXosip2/eXosip.h usability... yeschecking eXosip2/eXosip.h presence... yeschecking for eXosip2/eXosip.h... yeschecking for eXosip_subscribe_remove in -leXosip2... noconfigure: error: Could not find eXosip2 library with version >= 3.0.2 !据说是我的eXosip2 library版本太低,可是我用的明明就是3.2版本,有没有可能是系统里本来就有这个库,find一下,我几乎找了所有的主要路径都搜不到,除了自己编译的版本。
交叉编译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安装了没有,⼀般都安装了。
交叉编译链注意事项介绍在软件开发中,交叉编译是指在一种操作系统或硬件平台上开发出的软件能够在另一种操作系统或硬件平台上运行。
交叉编译链是用于进行交叉编译的工具链,包括编译器、链接器、调试器等工具。
本文将介绍交叉编译链的注意事项,帮助开发者更好地进行交叉编译工作。
选择合适的交叉编译链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表示使用硬件浮点运算。
termcap交叉编译摘要:一、引言二、termcap 交叉编译简介1.termcap 概念2.交叉编译的定义3.termcap 交叉编译的作用三、termcap 交叉编译过程1.准备工具和环境2.编写Makefile3.编译termcap 库4.测试与调试四、交叉编译中遇到的问题及解决方法1.编译错误2.运行时错误3.性能问题五、总结正文:一、引言随着科技的不断发展,嵌入式系统在各领域得到了广泛的应用。
在嵌入式系统中,终端处理是一个重要的环节。
termcap 交叉编译作为一种技术手段,能够帮助我们更好地处理终端相关问题。
本文将详细介绍termcap 交叉编译的相关知识。
二、termcap 交叉编译简介1.termcap 概念termcap(终端能力)是一个与终端相关的配置文件,它描述了终端的功能和特性。
通过termcap,我们可以获取终端的属性,如颜色、光标移动等,并针对不同的终端特性进行相应的处理。
2.交叉编译的定义交叉编译(Cross Compilation)是指在一个平台上(通常为通用计算机)编译另一个平台(嵌入式系统)上的程序。
这种编译方式可以充分发挥通用计算机的性能优势,提高开发效率。
3.termcap 交叉编译的作用termcap 交叉编译能够让我们在通用计算机上为嵌入式系统编译termcap 库,使其具有处理终端相关问题的能力。
这对于嵌入式系统开发者来说,具有很大的便利性。
三、termcap 交叉编译过程1.准备工具和环境首先,我们需要准备交叉编译工具链(如GCC、Make 等),以及目标平台的交叉编译环境。
此外,还需要安装相应的termcap 库和文档。
2.编写Makefile在编写Makefile 时,需要设置编译选项,如编译器、目标平台、链接器等。
同时,还需要包含termcap 库的源文件和头文件路径。
3.编译termcap 库在编译termcap 库时,需要根据Makefile 的设置进行编译。
交叉编译链注意事项(原创实用版)目录1.交叉编译链的定义和作用2.交叉编译链的注意事项3.解决交叉编译链中的问题正文一、交叉编译链的定义和作用交叉编译链是指在一个平台上编译另一个平台的代码,通常用于在不同架构和操作系统之间进行软件移植。
交叉编译链在嵌入式系统、游戏开发以及其他需要在不同平台上运行的软件开发中具有重要作用。
使用交叉编译链可以避免直接在目标平台上进行开发,从而提高开发效率和降低成本。
二、交叉编译链的注意事项1.确保目标平台和宿主机的架构和指令集匹配。
例如,如果目标平台是基于 ARM 架构的,那么需要使用 ARM 架构的交叉编译链。
2.确保宿主机上安装了目标平台所需的所有库和头文件。
这可以通过在宿主机上安装相应的开发工具包来实现。
3.配置交叉编译链的环境变量。
在编译过程中,需要指定目标平台的头文件和库文件的路径,以及目标平台的链接器和其他编译器工具。
4.交叉编译链的编译器和链接器需要与目标平台的版本保持一致。
否则,可能会导致编译出的代码在目标平台上无法运行。
5.对于复杂的软件项目,需要考虑如何在交叉编译链上管理依赖关系。
可以使用依赖管理工具,如 CMake、Make 等,来帮助管理依赖关系。
三、解决交叉编译链中的问题在使用交叉编译链进行开发过程中,可能会遇到一些问题,如编译错误、链接错误等。
针对这些问题,可以采取以下措施:1.仔细阅读编译器和链接器的错误信息,了解错误的原因,并根据错误信息进行相应的修改。
2.检查目标平台的头文件和库文件是否正确安装,以及环境变量设置是否正确。
3.如果遇到性能问题,可以考虑使用性能优化工具,如编译器优化选项、链接器优化选项等。
4.对于复杂的项目,可以考虑使用自动化构建工具,如 CMake、Make 等,来简化构建过程。
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. 交叉编译工具链版本:确保交叉编译工具链的版本与目标系统兼容。
有时,不同版本的交叉编译工具链可能导致问题。
交叉编译几种常见的报错由于是第一次交叉编译,不知道会出现什么问题,思路就是先把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的参数应该是交叉编译环境的前缀。
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!。
你遇到的 "undefined reference pthread_create" 错误可能是由于你在交叉编译时没有正确链接pthread库。
pthread库是POSIX线程库,是C语言编程中使用多线程必不可少的库。
当你使用交叉编译器编译程序时,需要确保你的编译器知道如何找到并链接目标平台上所需的库。
对于pthread库,你需要确保在编译命令中包含了正确的链接标志。
以下是在交叉编译时使用GCC的一个示例:
bash复制代码arm-linux-gnueabi-gcc -o my_program my_program.c -lpthread
在这个命令中,-lpthread 是链接标志,它告诉编译器链接pthread库。
如果你使用的是其他类型的交叉编译器,你可能需要查看相应的文档以确定正确的链接标志。
如果你正在使用的编译器不支持直接链接pthread库,你可能需要寻找一个适用于你的目标平台的pthread库版本,或者寻找一个等效的线程库。
如果你已经正确链接了pthread库但仍然遇到此错误,那可能是你的代码中并没有正确地调用
pthread_create函数。
请确保你的代码中已经包含了正确的头文件(#include <pthread.h>),并且正确地调用了pthread_create函数。
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:编译你的文件,发现工具好用,不会提示错误。
交叉编译几种常见的报错
由于是第一次交叉编译,不知道会出现什么问题,思路就是先把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 function `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.调试。