目录
Linux 命令详解./configure、make、make install 命令
LInux 强制重启报错The root filesystem on /dev/sda1 requires a manual fsck
linux下载命令
首先安装axel这个命令
sudo apt-get install axel
然后使用这个命令下载文件
例如:
axel http://soft.vpser.net/lnmp/lnmp0.8-full.tar.gz
curl 的用法指南
http://www.ruanyifeng.com/blog/2019/09/curl-reference.html
curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具。
解压zst文件
如果解压失败可以在windows下先用这个软件:peazip试下
https://www.peazip.org/peazip-64bit.html
linux中添加编译工具链的方法
1、vi /etc/profile
2、在最后添加编译工具路径,举例:
export PATH=$PATH:/opt/toolchains/crosstools-mips-gcc-4.6-linux-3.4-uclibc-0.9.32-binutils-2.21/usr/bin
3、source /etc/profile
4、echo $PATH
1.在windows下下载任意一个版本的交叉工具链压缩包(例如toolchain-4.4.6-farsight.tat.bz2),然后将此工具链复制到windows和ubuntu的共享文件夹share中。
2.在ubuntu系统的/usr/local文夹下新建文件夹arm,并且设置权限:
$sudo mkdir /usr/local/arm
$sudo chmod 777 /usr/local/arm
3.将共享文件夹中的交叉编译工具压缩包复制到/usr/local/arm文件夹下,并且解压:
$sudo cp /mnt/hgfs/share/toolchain-4.4.6-farsight/tar.bz2 /usr/local/arm/
$sudo tar xvf /usr/local/arm/toolchain-4.4.6-farsight
4.打开配置文件,修改环境变量,将交叉编译器的路径添加到PATH中:(.bashrc文件是在~目录下的一个隐藏文件!)
$sudo vim ~/.bashrc
然后在文件最后一行中加入内容:
export PATH=$PATH:/usr/local/arm/toolchain-4.4.6/bin/
5.重启配置文件更新环境变量,使之生效:
$source ~/.bashrc
6.检查是否将路径加入到PATH中:
$echo $PATH
7.测试工具链是否配置成功;
$arm-cortex_a8-linux-gnueabi-gcc -v
(1)如果显示工具链的相关信息和版本,则表明配置成功。
(2)如果显示找不到命令可能原因:64位系统缺少lib32stdc++6这个包,执行以下命令:
$sudo apt-get install lib32stdc++6
8.新建一个hello.c源文件,然后用交叉工具链进行编译测试:
$arm-cortex_a8-linux-gnueabi-gcc hello.c
(1)如果显示找不到文件和目录,则执行以下命令:
$sudo apt-get install lsb-core
Linux 命令详解./configure、make、make install 命令
这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤
一、基本信息
1、./configure 是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。
2、make 是用来编译的,它从Makefile中读取指令,然后编译。
3、make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。
注意:AUTOMAKE和AUTOCONF是非常有用的用来发布C程序的东西。
二、详细解释
1、configure命令
这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,比如代码:./configure –prefix=/usr 意思是将该软件安装在 /usr 下面,执行文件就会安装在 /usr/bin (而不是默认的 /usr/local/bin),资源文件就会安装在 /usr/share(而不是默认的/usr/local/share)。同时一些软件的配置文件你可以通过指定 –sys-config= 参数进行设定。有一些软件还可以加上 –with、–enable、–without、–disable 等等参数对编译加以控制,你可以通过允许 ./configure –help 察看详细的说明帮助。
2、make
这一步就是编译,大多数的源代码包都经过这一步进行编译(当然有些perl或python编写的软件需要调用perl或python来进行编译)。如果 在 make 过程中出现 error ,你就要记下错误代码(注意不仅仅是最后一行),然后你可以向开发者提交 bugreport(一般在 INSTALL 里有提交地址),或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。
可能遇到的错误:make *** 没有指明目标并且找不到 makefile。 停止。问题很明了,没有Makefile,怎么办,原来是要先./configure 一下,再make。
3、make insatll
这条命令来进行安装(当然有些软件需要先运行 make check 或 make test 来进行一些测试),这一步一般需要你有 root 权限(因为要向系统写入文件)。
三、扩展说明
Linux的用户可能知道,在Linux下安装一个应用程序时,一般先运行脚本configure,然后用make来编译源程序,在运行make install,最后运行make clean删除一些临时文件。使用上述三个自动工具,就可以生成configure脚本。运行configure脚本,就可以生成Makefile文件,然后就可以运行make、make install和make clean。
configure是一个shell脚本,它可以自动设定源程序以符合各种不同平台上Unix系统的特性,并且根据系统叁数及环境产生合适的Makefile文件或是C的头文件(header file),让源程序可以很方便地在这些不同的平台上被编译连接。
这时,就可运行configure脚本了,运行configure脚本,就可产生出符合GNU规范的Makefile文件了: $ ./configure
到此时,就可以运行make进行编译,在运行make install进行安装了,最后运行make clean删除临时文件。
$ make
$ make install (注:运行这个要有足够的权限)
$ make clean
利用configure所产生的Makefile文件有几个预设的目标可供使用,其中几个重要的简述如下:
make all:产生我们设定的目标,即此范例中的可执行文件。只打make也可以,此时会开始编译原始码,然后连结,并且产生可执行文件。
make clean:清除编译产生的可执行文件及目标文件(object file,*.o)。
make distclean:除了清除可执行文件和目标文件外,把configure所产生的Makefile也清除掉。
make install:将程序安装至系统中。如果原始码编译无误,且执行结果正确,便可以把程序安装至系统预设的可执行文件存放路径。如果用bin_PROGRAMS宏的话,程序会被安装至/usr/local/bin这个目录。
make dist:将程序和相关的档案包装成一个压缩文件以供发布。执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz为名称的文件。 PACKAGE和VERSION这两个变数是根据configure.in文件中AM_INIT_AUTOMAKE(PACKAGE,VERSION)的定义。在此范例中会产生test-1.0.tar.gz的档案。
make distcheck:和make dist类似,但是加入检查包装后的压缩文件是否正常。这个目标除了把程序和相关文件包装成tar.gz文件外,还会自动把这个压缩文件解开,执行 configure,并且进行make all 的动作,确认编译无误后,会显示这个tar.gz文件可供发布了。这个检查非常有用,检查过关的包,基本上可以给任何一个具备GNU开发环境-的人去重新编译。
参考:
Linux ARM交叉编译工具链制作过程
https://www.itdaan.com/blog/2013/02/21/7c0731b1c444fb4bf61dc8495047ab78.html
一、下载源文件 源代码文件及其版本与下载地址: Binutils-2.19.tar.bz2 http://ftp.gnu.org/gnu/binutils/ gcc-4.4.4.tar.bz2 http://mirrors.kernel.org/gnu/gcc/gcc-4.4.4/ Glibc-2.11.2.tar.bz2 Glibc-ports-2.11.tar.bz2 Gmp-4.2.tar.bz2 Mpfr-2.4.0.tar.bz2 Linux-2.6.29.tar.bz2 Patch-2.6.29.bz2 http://www.kernel.org/pub/linux/kernel/v2.6/ 一般一个完整的交叉编译器涉及到多个软件,主要包括binutils、gcc、glibc等。其中,binutils主要生成一些辅助工具;gcc是用来生成交叉编译器,主要生成arm-linux-gcc交叉编译工具,而glibc主要提供用户程序所需要的一些基本函数库。 二、建立工作目录 编译所用主机型号 FC12.i686 第一次编译时用的是root用户(第二次用一般用户karen,该用户可以使用sudo指令) 所有的工作目录都在/home/Karen/cross下面建立完成,首先在/home/karen目录下建立cross目录 [root@localhost karen] mkdir cross 进入工作目录: [root@localhost root]#cd /home/karen/cross [root@localhost cross ]# pwd 创建工具链文件夹: [root@localhost cross]# mkdir embedded-toolchains 在建立了顶层文件夹embedded- toolchains,下面在此文件夹下建立如下几个目录: Ø setup-dir,存放下载的压缩包; Ø src-dir,存放binutils、gcc、glibc解压之后的源文件; Ø kernel,存放内核文件,对内核的配置和编译工作也在此完成; Ø build-dir ,编译src-dir下面的源文件,这是GNU推荐的源文件目录与编译目录分离的做法; Ø tool-chain,交叉编译工具链的安装位; Ø program,存放编写程序; Ø doc,说明文档和脚本文件; 下面建立目录,并拷贝源文件。 [root@localhost cross] #cd embedded- toolchains 拷贝源文件: [root@localhost embedded- toolchains] #chmod 777 setup-dir 然后直接拷贝/home/karen目录下的源文件到setup-dir目录中,如下图: 建立编译目录: [root@localhost setup-dir] #cd ../build-dir 三、输出环境变量 输出如下的环境变量方便我们编译。 为简化操作过程。下面就建立shell命令脚本environment-variables: [root@localhost scripts] #vi envionment-variables 截图如下: %% Q:为什么用了source ./environment-variables才正常执行,去掉source就没有执行? %% %% 如果用source 执行, 不需要脚本有执行权限, 权限为664也可以,执行命令如下:%% %% Source environment-variables %% 说明: TARGET变量用来定义目标板的类型,以后会根据此目标板的类型来建立工具链。参 看表6-1所示。目标板的定义与主机的类型是没有关系的,但是如果更改TARGET的值, GNU工具链必须重新建立一次。 如果不惯用环境变量的,可以直接用绝对或相对路径。如果不用环境变量,一般都用绝对路径,相对路径有时会失败。环境变量也可以定义在.bashrc文件中,这样就不用老是export这些变量了。 体系结构和TAEGET变量的对应如下表6-1所示: 表6-1 体系结构和TAEGET变量的对应
四、建立二进制工具(binutils) Binutils是GNU工具之一,它包括连接器、汇编器和其他用于目标文件和档案的工具,它是二进制代码的处理维护工具。安装Binutils工具包含的程序有addr2line、ar、as、c++filt、gprof、ld、nm、objcopy、objdump、ranlib、readelf、size、strings、strip、libiberty、libbfd和libopcodes。对这些程序的简单解释如下。 Ø addr2line 把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。 Ø ar 建立、修改、提取归档文件。归档文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。 Ø as 主要用来编译GNU C编译器gcc输出的汇编文件,产生的目标文件由连接器ld连接。 Ø c++filt 连接器使用它来过滤 C++ 和 Java 符号,防止重载函数冲突。 Ø gprof 显示程序调用段的各种数据。 Ø ld 是连接器,它把一些目标和归档文件结合在一起,重定位数据,并连接符号引用。通常,建立一个新编译程序的最后一步就是调用ld。 Ø nm 列出目标文件中的符号。 Ø objcopy 把一种目标文件中的内容复制到另一种类型的目标文件中。 Ø objdump 显示一个或者更多目标文件的信息。使用选项来控制其显示的信息,它所显示的信息通常只有编写编译工具的人才感兴趣。 Ø ranlib 产生归档文件索引,并将其保存到这个归档文件中。在索引中列出了归档文件各成员所定义的可重分配目标文件。 Ø readelf 显示elf格式可执行文件的信息。 Ø size 列出目标文件每一段的大小以及总体的大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。 Ø strings 打印某个文件的可打印字符串,这些字符串最少4个字符长,也可以使用选项-n设置字符串的最小长度。默认情况下,它只打印目标文件初始化和可加载段中的可打印字符;对于其它类型的文件它打印整个文件的可打印字符。这个程序对于了解非文本文件的内容很有帮助。 Ø strip 丢弃目标文件中的全部或者特定符号。 Ø libiberty 包含许多GNU程序都会用到的函数,这些程序有getopt、obstack、strerror、strtol和strtoul。 Ø libbfd 二进制文件描述库。 Ø libopcode 用来处理opcodes的库,在生成一些应用程序的时候也会用到它。 Binutils工具安装依赖于Bash、Coreutils、Diffutils、GCC、Gettext、Glibc、Grep、Make、Perl、Sed、Texinfo等工具 下面将分步介绍安装binutils-2.19.2的过程。 [root@localhost script] # cd $PRJROOT/src-dir [root@localhost build-binutils] #http://www.cnblogs.com/src-dir/binutils-2.19/configure --target=$TARGET --prefix=$PREFIX 在build-binutils目录下面生成Makefile文件,然后执行make,make install。完成后可以在$PREFIX/bin下面看到我们的新的binutil。 注意:每个工具的文件名的前缀都是前面为TARGET变量设定的值。如果目标板arm-linux,那么这些工具的文件名前缀就会是arm-linux-。这样就可以根据目标板类型找到正确的工具程序。 五、建立内核头文件 在这里我们使用时2.6.29的内核版本,因为交叉工具链工具链是针对特定的处理器和操作系统的,因此在编译之前就需要对linux内核进行配制,可以通过“make config”或“make menuconfig”命令对内核进行配制,配制完成后,在linux源文件的目录下就会生成一个.config文件,这就是我们所需要的文件。 Note: 目标板的内核版本是2.6.29 [root@localhost embedded- toolchains] #cd kernel [root@localhost kernel] #tar jxvf ../setup-dir/ linux-2.6.29.tar.bz2 [root@localhost linux-2.6.29] #patch –p1 < http://www.cnblogs.com/setup-dir/patch-2.6.29 然后就是配置内核,第一步是修改Makefile 修改 Makefile: ARCH = arm CROSS_COMPILE = arm-linux- menuconfig 接着使用make menuconfig进入内核配置菜单 或者直接写: # make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig ,注意在配置时一定要选择处理器的类型,比如我的目标机使用的处理器是OMAP类型的,就选TI OMAP: System Type -à ARM System Type -à (x) TI OMAP 配置完退出并保存。 配置完须执行make,参数如下: [root@localhost linux-2.6.29]# make ARCH=arm CROSS_COMPILE=arm-linux- (执行过程中有错误出现也没关系,主要目的是产生头文件version.h和autoconf.h) 执行完检查一下内核目录中的/kernel/linux-2.6.29/include/linux/version.h和autoconf.h文件是不是生成了,这是编译glibc要用到的。version.h 和 autoconf.h 文件的存在,说明你生成了正确的头文件。 接下来建立工具链需要的include目录,并将内核头文件复制过去。 可以查看一下,经过编译可以自动生成。如果已经生成链接,则不必重新链接。(2.6.29已自动生成) [root@localhost asm] #ln -s proc-armv proc 可以查看一下,经过编译可以自动生成。如果已经生成链接,则不必重新链接。 复制头文件到交叉编译工具链的安装目录: [root@localhost asm] #mkdir –p $TARGET_PREFIX/include [root@localhost asm] #cp –r $PRJROOT/ kernel /linux-2.6.29/include/asm-generic $TARGET_PREFIX/include root@localhost asm] #cp –r $PRJROOT/ kernel /linux-2.6.29/arch/arm/include/asm $TARGET_PREFIX/include root@localhost asm] #cp –r $PRJROOT/ kernel /linux-2.6.29/arch/arm/mach-omap2/include/mach $TARGET_PREFIX/include/asm Note: mach-xxx是根据目标板所用的cpu类型来选择的 六、建立初始编译器 (boot strap gcc) 这一步的目的主要是建立arm-linux-gcc工具,注意这个gcc没有glibc库的支持,所以只能用于编译内核、BootLoader等不需要C库支持的程序,后面创建C库也要用到这个编译器,所以创建它主要是为创建C库做准备,如果只想编译内核和BootLoader,那么安装完这个就可以到此结束。安装过程如下: [root@localhost build-binutils] #cd $PRJROOT/setup-dir 重命名: 从 GCC-4.3起,安装GCC将依赖于GMP-4.1以上版本和MPFR-2.3.2以上版本。如果将这两个软件包分别解压到GCC源码树的根目录下,并分别命名为"gmp"和"mpfr",那么GCC的编译程序将自动将两者与GCC一起编译。建议尽可能使用最新的GMP和MPFR版本。 [root@localhost src-dir]# tar jxvf ../setup-dir/mpfr-2.4.0.tar.bz2 [root@localhost src-dir]# tar jxvf ../setup-dir/gmp-4.2.tar.bz2 [root@localhost src-dir]# mv mpfr-2.4.0 gcc-4.4.4/mpfr [root@localhost src-dir]# mv gmp-4.2.0 gcc-4.4.4/gmp •因为是交叉编译器,还不需要目标板的系统头文件,所以需要使用 --without-headers这个选项。否则会有很多*.h头文件找不到的报错 •--enable-language=c用来告诉配置脚本,需要产生的编译器支持何种语言,现在只需支持C语言。虽然配置为c,c++也可以的 •--disable-threads 是因为threads需要libc的支持。 •--disable-decimal-float,需要libc的支持,而我们在初步编译的时候尚未生成libc,否则出现以下的报错: http://www.cnblogs.com/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:52:18: error: fenv.h: No such file or directory http://www.cnblogs.com/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c: In function '__dfp_test_except': http://www.cnblogs.com/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: 'FE_INEXACT' undeclared (first use in this function) http://www.cnblogs.com/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: (Each undeclared identifier is reported only once http://www.cnblogs.com/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: for each function it appears in.) •--disable-shared,既然是第一次安装ARM交叉编译工具,那么本机的glibc支持的应该是本机的编译工具库,而不是ARM交叉编译工具库。forces GCC to link its internal libraries statically,没有这个选项,会有 crti.o: No such file: No such file or directory collect2: ld returned 1 exit status 注:由于没有arm的glibc,需要使用--disable-libmudflap --disable-libssp,禁止两个边界检查使用的库。 同样,由于第一次安装ARM交叉编译工具,那么支持的libc库的头文件也没有,src-dir/gcc-4.4.4/gcc/config/arm/t-linux文件,在TARGET_LIBGCC2_CFLAGS中添加两个定义:-Dinhibit_libc –D__gthr_posix_h 原文: TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer –fPIC 改后: TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D_gthr_posix.h 编译: [root@localhost build-gcc]# http://www.cnblogs.com/src-dir/gcc-4.4.4/configure --target=$TARGET --prefix=$PREFIX --without-headers --enable-languages=c --disable-shared --disable-threads --disable-decimal-float –disable-libmudflap –disable-lipssp [root@localhost build-gcc]# make all-gcc [root@localhost build-gcc]# make install-gcc [root@localhost build-gcc]# make all-target-libgcc [root@localhost build-gcc]# make install-target-libgcc 注:很多资料中之有前面两项,这只建立了gcc,没有建立libgcc.a,这样会在glibc的编译中出现-lgcc没有找到的错误。报告: ……/build-tools/build-glibc/libc_pic.a i586-linux-gcc -nostdlib -nostartfiles -r -o /home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/librtld.map.o '-Wl,-(' /home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/dl-allobjs.os /home/wei/workspace/mywork/moblin/build-tools/build-glibc/libc_pic.a -lgcc '-Wl,-)' -Wl,-Map,/home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/librtld.mapT /workspace/wei/mywork/moblin/tools/bin/../lib/gcc/arm-linux/4.4.4/http://www.cnblogs.com/http://www.cnblogs.com/ram-linux/bin/ld: cannot find -lgcc 在glibc的编译中,还需要libgcc_eh.a(否则出现错误:-lgcc_eh没有找到……bin/ld: cannot find -lgcc_eh),使用了--disable-shared的选项,将不会生成libgcc_eh.a,可以通过对libgcc.a的链接来实现。 [root@localhost build-gcc]# ln -vs libgcc.a `arm-linux-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'` Note:arm-linux-gcc与-print-libgcc-file-name之间有一个空格 运行报告: “/workspace/wei/mywork/moblin/tools/bin/../lib/gcc/i586-linux/4.3.3/libgcc_eh.a” -> “libgcc.a” 装完成后,查看结果: [root@localhost build-gcc] #ls $PREFIX/bin 如果arm-linux-gcc等工具已经生成,表示boot trap gcc工具已经安装成功 七、编译glibc 这一步是最为繁琐的过程,目标板必须靠它来执行或者是开发大部分的应用程序。glibc套件常被称为C链接库,但是glibc实际产生很多链接库,其中之一是C链接库libc。因为嵌入式系统的限制,标准GNU C链接库显得太大,不适合应用在目标板上。所以需要寻找C链接库的替代品,在这里现以标准GNU C为例建立工具链。 [root@localhost build-gcc] #cd $PRJROOT/src-dir [root@localhost src-dir] # mv –v glibc-ports-2.11 glibc-2.11.2/ports [root@localhost src-dir] # cd glibc-2.11.2 [root@localhost glibc-2.11.2] # patch –Np1 –i http://www.cnblogs.com/setup-dir/glibc-2.11.2-gcc_fix-1.patch [root@localhost glibc-2.11.2] # patch –Np1 –i http://www.cnblogs.com/setup-dir/glibc-2.11.2-makefile_fix-1.patch [root@localhost glibc-2.11.2] # cd $PRJROOT/build-dir/build-glibc [root@localhost build-glibc] # CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib / --with-tls --disable-profile / --with-headers=$PREFIX/$TARGET/include / libc_cv_arm_tls=yes [root@localhost build-glibc] # make [root@localhost build-glibc] # make install 注:以上完成后,请查看一下$TARGET_PREFIX/lib目录下的文件libc.so,看看GROUP的内容是否指定到可以用于交叉编译的库,如果不是请修改,如下。 libc.so 文件(所在目录是$TARGET_PREFIX/lib),将GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a)改为GROUP ( libc.so.6 libc_nonshared.a) 这样连接程序 ld 就会在 libc.so 所在的目录查找它需要的库,因为你的机子的/lib目录可能已经装了一个相同名字的库,一个为编译可以在你的宿主机上运行的程序的库,而不是用于交叉编译的。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 经过查看,发现libc.so中的GROUP已经是交叉编译链的目录,所以不用更改 对 libc.so 的修正·
vi $PREFIX /${TARGET}/lib/libc.so
去掉绝对路径,修改后的内容如下:
/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf32-littlearm)
GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux.so.3 ) ) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 八、建立全套编译器 (full gcc) [root@localhost build-gcc] #http://www.cnblogs.com/src-dir/gcc-4.4.4/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++ --enable-shared [root@localhost build-gcc] #make all [root@localhost build-gcc] #make install 我们再来看看 $PREFIX/bin 里面多了哪些东西。你会发现多了 arm-linux-g++ 、和 arm-linux-c++ 几个文件。 G++-gnu的 c++ 编译器。 C++-gnu 的 c++ 编译器。 至此,整个交叉编译环境就建立完成了。 九、完成工具链的设置 root@localhost build-gcc] # cd $TARGET_PREFIX/bin 查看文件是否为二进制文件: 查看缺省的搜寻路径: 十、测试和验证交叉编译工具 下面编写一个简单的C程序,使用建立的工具链。、 int main(void) { printf("hello linux/n"); return 0; } [root@localhost program] #arm-linux-gcc hello.c -o hello –static (制作静态可执行文件) 制作的可执行文件hello可以直接在目标机上运行。 |
GNU编译工具链包括binutils,gcc,glibc
binutils:汇编器、连接器
gcc:预处理器、编译器
glibc: C语言库
编译arm-linux-gcc要编译两次,第1次是不带库的纯gcc,可以用来编译裸机程序如linux内核,u-boot等.
然后用第1次编译的gcc来编译目标glibc(或者uclibc)
然后进行第二次gcc编译.
准备以下源码:
binutils-2.25.tar.bz2
gcc-4.9.2.tar.bz2
glibc-2.21.tar.xz
gmp-5.1.3.tar.xz
linux-3.4.106.tar.xz
mpc-1.0.3.tar.gz
mpfr-3.1.2.tar.xz
编译顺序:
gmp -> mpfr -> mpc -> binutils -> gcc -> glibc -> binutils -> gcc
1.依次编译gmp,mpfr,mpc
默认安装位置是/usr/local/lib
#./configure
#make
#make install
2.编译binutils
# ./configure --host=i686-linux-gnu --disable-nls --disable-multilib --disable-shared --target=arm-linux-gnueabi --prefix=/home/toolchain/arm-linux-gnueabi-4.9.2 --with-sysroot=/home/toolchain/arm-linux-gnueabi-4.9.2/arm-linux-gnueabi/sysroot
#./configure --disable-nls --disable-multilib --disable-shared --target=arm-none-linux-gnueabi --prefix=/home/toolchain/arm-linux-gcc-nolibc
# make
# make install
3.编译gcc
../configure --host=i686-linux-gnu --enable-targets=all --disable-shared --enable-languages=c --disable-checking --disable-threads --disable-multilib --disable-nls --disable-decimal-float --disable-libgomp --disable-libmudflap --disable-libssp --without-headers --with-newlib --disable-bootstrap --disable-libquadmath --disable-libatomic --with-cpu=arm920t --target=arm-none-linux-gnueabi --prefix=/home/toolchain/arm-none-linux-gnueabi
4.编译glibc
#CC=arm-none-linux-gnueabi-gcc ../configure --host=arm-linux-gnueabi --prefix=/usr --enable-kernel=2.6.32 --with-headers=/home/gnu/linux-3.4.106/usr/include --disable-profile --with-tls --enable-shared -cache-file=config.cache
#make -j4
#make install_root=/home/toolchain/arm-linux-gcc/arm-linux-gnueabi/sysroot install
5.再编译gcc
../configure --host=i686-linux-gnu --disable-shared --enable-targets=all --with-cpu=arm920t --enable-languages=c --disable-multilib --disable-nls --disable-decimal-float --disable-libgomp --disable-libmudflap --disable-libssp --disable-bootstrap --disable-libquadmath --disable-libatomic --target=arm-linux-gnueabi --enable-threads=posix --prefix=/home/toolchain/arm-linux-gnueabi-4.9.2 --with-sysroot=/home/toolchain/arm-linux-gnueabi-4.9.2/arm-linux-gnueabi/sysroot
环境变量:
【1】include头文件路径
除了默认的/usr/include, /usr/local/include等include路径外,还可以通过设置环境变量来添加系统include的路径:
# C
export C_INCLUDE_PATH=XXXX:$C_INCLUDE_PATH
# CPP
export CPLUS_INCLUDE_PATH=XXX:$CPLUS_INCLUDE_PATH
以上修改可以直接命令行输入(一次性),可以在/etc/profile中完成(对所有用户生效),也可以在用户home目录下的.bashrc或.bash_profile中添加(针对某个用户生效),修改完后重新登录即生效。
unset环境变量:
新建目录
the root filesystem on /dev
LInux 强制重启报错The root filesystem on /dev/sda1 requires a manual fsck
修复问题磁盘
(initramfs) fsck /dev/sda1
然后系统重启
reboot
svn安装
安装svn
apt-get install subversion
linux清空jobs及后台执行
fg、bg、jobs、&、nohup、ctrl+z、ctrl+c 命令 一、& 加在一个命令的最后,可以把这个命令放到后台执行,如 watch -n 10 sh test.sh & #每10s在后台执行一次test.sh脚本 二、ctrl + z 可以将一个正在前台执行的命令放到后台,并且处于暂停状态。 三、jobs 查看当前有多少在后台运行的命令 jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated。但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识。也就是说,jobs命令显示的是当前shell环境中所起的后台正在运行或者被挂起的任务信息; 四、fg 将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用fg %jobnumber(是命令编号,不是进程号)将选中的命令调出。 五、bg 将一个在后台暂停的命令,变成在后台继续执行。如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出。 将任务转移到后台运行: 先ctrl + z;再bg,这样进程就被移到后台运行,终端还能继续接受命令。 概念:当前任务 如果后台的任务号有2个,[1],[2];如果当第一个后台任务顺利执行完毕,第二个后台任务还在执行中时,当前任务便会自动变成后台任务号码“[2]” 的后台任务。所以可以得出一点,即当前任务是会变动的。当用户输入“fg”、“bg”和“stop”等命令时,如果不加任何引号,则所变动的均是当前任务 六、kill 法子1:通过jobs命令查看job号(假设为num),然后执行kill %num 前台进程的终止:Ctrl+c kill的其他作用 kill除了可以终止进程,还能给进程发送其它信号,使用kill -l 可以察看kill支持的信号。 SIGTERM是不带参数时kill发送的信号,意思是要进程终止运行,但执行与否还得看进程是否支持。如果进程还没有终止,可以使用kill -SIGKILL pid,这是由内核来终止进程,进程不能监听这个信号。 七、nohup 如果让程序始终在后台执行,即使关闭当前的终端也执行(之前的&做不到),这时候需要nohup。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。关闭中断后,在另一个终端jobs已经无法看到后台跑得程序了,此时利用ps(进程查看命令) |