标签 build 下的文章

这是现在不同标准下给出的扩展名: Unix: C, cc, cxx, c

GNU C++: C, cc, cxx, cpp, c++

Digital Mars: cpp, cxx

Borland: C++ cpp

Watcom: cpp

Microsoft Visual C++: cpp, cxx, cc

Metrowerks CodeWarrior: cpp, cp, cc, cxx, c++

if 分支编译

类似于下面的写法

TENGINE = MASTER
#TENGINE = LITE

ifeq ($(TENGINE), MASTER)
CPPFLAGS += -DTENGINE_MT
else ifeq ($(TENGINE), LITE)
CPPFLAGS += -fsanitize=address -fsanitize=leak
endif

参考: http://c.biancheng.net/view/7068.html
https://www.cnblogs.com/SoaringLee/p/10532151.html

=, :=, ?=, += 区别

= 是最基本的赋值 := 是覆盖之前的值 ?= 是如果没有被赋值过就赋予等号后面的值 += 是添加等号后面的值

= make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。

            x = foo
            y = $(x) bar
            x = xyz

y的值将会是 xyz bar ,而不是 foo bar

:= 表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。

            x := foo
            y := $(x) bar
            x := xyz

y的值将会是 foo bar ,而不是 xyz bar 了。

参考: https://www.cnblogs.com/wanqieddy/archive/2011/09/21/2184257.html

warn

"defined but not used"

gcc 编译有"defined but not used" 警告,那么在 CPPFLAGS 这边进行修改:

WARNFLAGS = -Wall -Wno-unused-function
CPPFLAGS =-std=c++11  $(WARNFLAGS) ...

参考: https://blog.csdn.net/qq_28584889/article/details/97764810
https://cloud.tencent.com/developer/ask/119165

error: this ‘if’ clause does not guard... [-Werror=misleading-indentation], misleadingly indented as if it were guarded by” an if?

这个是 if 代码下面的缩进有些问题,只要检查缩进就行。有可能是多缩进了,也有可能是空格和 tab 混合使用。

参考: https://stackoverflow.com/questions/50318900/why-is-gcc-warning-me-this-line-is-misleadingly-indented-as-if-it-were-guarded
https://blog.csdn.net/lun55423/article/details/115530114

在没有网络的情况下非常适合从一个已经安装包的电脑上拷贝包到另一个没有安装包的电脑上。 1、进入第三方库安装的路径的文件夹。\site-packages 2、找到需要的包复制即可。注意一个库的包有两个文件,要同时复制。 3、将包移动到另一台电脑上的\site-packages 粘贴即可使用。

注意: 有些需要编译的包,可能会多一个编译后的 so 的库文件。这个也要打包进去。

参考:

https://blog.csdn.net/m0_38039437/article/details/101779197

服务器开启 tftp 用来传输 dtb 和 kernel vmimage

配置 tftp 服务端

首先安装 tftp 服务, sudo apt install tftpd-hpa,然后检查服务是否启动,sudo systemctl status tftpd-hpa,这个需要等待一会才能返回信息。

然后配置 tftp 服务, sudo vim /etc/default/tftpd-hpa,username 这一项要和 tftp 目录的 owner 相对应,address 是对应的端口号, options 中的 secure 是自动更新目录,create 是可以创建和上传文件。 修改如下:

TFTP_DIRECTORY="/tftpboot"

然后是配置 tftp 目录:

sudo mkdir /tftp
sudo chown tftp:tftp /tftp

接着是重启并检查状态:

sudo systemctl restart tftpd-hpa
sudo systemctl status tftpd-hpa

在客户端安装 tftp 客户端,测试服务端有没有问题。

首先安装 tftp 客户端 sudo apt install tftp-hpa, 然后再服务器端使用 ifconfig 或者 ip -a 来获取服务器地址,然后再客户端使用 tftp 192.168.0.10 类似的命令来连接上服务器端的 tftp 服务。 在 tftp 的环境下,输入 verbose 开启 verbose 模式,然后可以通过 get xxx.txt 来下载文件,通过 put xxx.txt 来上传文件。 都是从当前目录进行上传和下载,最后使用 quit 来退出 tftp 模式。

可以使用 ? 或者 help 来查询命令。

参考:

https://linuxhint.com/install_tftp_server_ubuntu/ https://wangchujiang.com/linux-command/c/tftp.html

服务器开启 nfs 用来共享 rootfs

配置 nfs 服务器端

首先安装nfs,sudo apt install nfs-kernel-server.

然后创建 nfs 文件夹, sudo mkdir -p /nfs/rootfs/, 然后因为 nfs 传输 root 属性的文件时会改为 nobody:nogroup,所以需要修改文件夹的 owner,sudo chown nobody:nogroup /nfs/rootfs/

然后修改 exports,sudo vim /etc/exports,内容增加 /nfs/rootfs *(rw,sync,no_root_squash)

然后重启 nfs 服务,sudo systemctl restart nfs-kernel-server

然后检查 ufw 状况, sudo ufw status,如果启动,那么需要 sudo ufw allow from 203.0.113.24 to any port nfs 类似这样的来放行。

安装 nfs 客户端

首先安装 nfs, sudo apt install nfs-common. 然后新建测试文件夹,mkdir nfs_test 挂载nfs,sudo mount 192.168.0.10:/nfs/rootfs /home/xyz/nfs_test/ 使用 df -h 可以查看挂载的情况,使用 du -sh ./nfs_test/ 可以查看文件夹内部使用情况。

测试

在客户端上创建一个文件,在客户端上就能够查看到,使用 ll 命令可以查看 owner,如果在服务器端配置 exports 里面的 no_root_squash,那么就是 root,否则就是 nobody:nogroup

参考:

https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-ubuntu-18-04 https://blog.csdn.net/flfihpv259/article/details/53926871?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-8.control&dist_request_id=1332042.22423.16193225079781727&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-8.control https://blog.csdn.net/qq_36357820/article/details/78488077

修改内核

修改内核中的选项

File systems  ---> 
   [*] Network File Systems  ---> 
       <*>   NFS client support 
       <*>     NFS client support for NFS version 2
       <*>     NFS client support for NFS version 3     
       [*]   Root file system on NFS

General setup  --->
   [N] Initial RAM filesystem and RAM disk (initramfs/initrd) support

准备文件

准备内核和设备树

复制 boot.img 和 dtb.img 到 tftp 目录

修改boot

修改 uboot 变量

setenv nfsfile boot.img
setenv rootpath /nfs/rootfs/
setenv ipaddr 10.15.5.3
setenv serverip 10.15.5.30
setenv nfsargs 'set bootargs root=/dev/nfs rw nfsroot=${serverip}:${rootpath} proto=tcp nfsvers=3 clkin_hz=(25000000) earlyprintk=serial,uart0,115200 console=ttySC0,115200 mem=224M'
setenv nfsboot 'tftp ${loadaddr} ${nfsfile};tftp ${dtbaddr} ${dtbfile};run nfsargs;run addip;bootm ${loadaddr} - ${dtbaddr}'
setenv bootcmd run nfsboot

测试网络

使用 ping 来测试和服务器之间通不通。

下载内核

tftp

参考:

https://docs.khadas.com/zh-cn/vim3/LoadImagesWithUBootViaTFTP.html https://blog.csdn.net/Slade99X/article/details/104774142

加载文件系统

1. 下载 gcc 4.9.3 的源代码。

http://ftp.gnu.org/gnu/gcc/gcc-4.9.3/ 或者国内的交大 https://mirrors.sjtug.sjtu.edu.cn/gnu/gcc/gcc-4.9.3/

2. 解压 gcc 源码,然后从 gcc-4.9.3/contrib/download_prerequisites 这个文件中读取需要依赖的包。下载相应的依赖包。

# Necessary to build GCC.
MPFR=mpfr-2.4.2
GMP=gmp-4.3.2
MPC=mpc-0.8.1
  ISL=isl-0.12.2
  CLOOG=cloog-0.18.1

https://mirrors.sjtug.sjtu.edu.cn/gnu/ 可以下载 gcc, mpfr, gmp https://sourceforge.net/projects/d2718c/ 可以下载好几个东西,但是速度是个问题。 https://src.fedoraproject.org/lookaside/extras/gcc/isl-0.12.2.tar.bz2 可以下载 isl ,速度还可以。

3. 把第二部的压缩包解压到 gcc 源码目录下,然后 ln -sf xxx-xxx xxx,建立这几个包的软连接。如果不想这么麻烦,并且网络很好的话,直接在上一步执行 download_prerequisites 也可以。

4.

cd ..
mkdir gcc-4.9.3-build-temp
cd gcc-4.9.3-build-temp

5. 根据原来机器的 gcc -v 获得相应的 config 选项,然后配置新的选项,做成脚本进行执行。

6. config 的时候,报错:

GNAT is required to build ada 这个因为不需要 ada,所以直接在 language 选项里面去掉 ada 就可以了。 参考: http://gcc.1065356.n8.nabble.com/GNAT-is-required-to-build-ada-td692409.html https://github.com/spack/spack/issues/15867 https://github.com/owent-utils/bash-shell/issues/2

6. make -jX 之后,报错:

In file included from ../../gcc-4.9.3/gcc/cp/except.c:1013:cfns.gperf:101:1: error: ‘const char libc_name_p(const char, unsigned int)’ redeclared inline with ‘gnu_inline’ attribute

这个使用 4.9.4 版本就可以了。 参考: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=831142 https://github.com/jens-maus/RaspberryMatic/issues/28

7. 报错:

/md-unwind-support.h: In function ‘aarch64_fallback_frame_state’:error: field ‘uc’ has incomplete typestruct ucontext uc; 这个是因为 glibc 有更新导致的,需要修改 gcc-4.9.4/libgcc/config/XXX/linux_unwind.h 这个头文件,把 struct ucontext uc; 去掉,换成 ucontext_t uc; 因为 /usr/include/sys/ucontext.h 里面是这个定义。所以要按照新的 libc 来修改一下。当然也可以打补丁代替手动修改。

参考: https://stackoverflow.com/questions/46999900/how-to-compile-gcc-6-4-0-with-gcc-7-2-in-archlinux https://blog.csdn.net/XCCCCZ/article/details/80958414 https://patchwork.ozlabs.org/project/buildroot/patch/20170923212414.16744-10-romain.naour@gmail.com/ http://lists.busybox.net/pipermail/buildroot/2017-September/202526.html https://blog.csdn.net/wang805447391/article/details/83380302 https://unix.stackexchange.com/questions/566650/how-do-i-compile-gcc-5-from-source https://stackoverflow.com/questions/52498431/compile-gcc6-4-0-using-gcc8-1-1 https://gcc.gnu.org/git/?p=gcc.git;a=blobdiff;f=libgcc/config/aarch64/linux-unwind.h;h=d46d5f53be379ec2dbc9a5ba95d51e22c1d52c2f;hp=d5d6980442fd47b1f1e499e99cb25b5fffbdbeb3;hb=883312dc79806f513275b72502231c751c14ff72;hpb=601d22f69093aa98dcf9593bc138da7ba8281e05 https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=883312dc79806f513275b72502231c751c14ff72

8. 报错:

/home/openailab/Downloads/test/gcc-4.9.4-build-temp/./gcc/xgcc: /home/openailab/Downloads/test/gcc-4.9.4-build-temp/aarch64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /home/openailab/Downloads/test/gcc-4.9.4-build-temp/./gcc/xgcc)
make[3]: *** [Makefile:942: libgcc_s.so] Error 1

这个错误网上找不到解决方法,这个尝试暂停。

参考:

https://www.cnblogs.com/succeed/p/6204438.html https://www.cnblogs.com/alianbog/p/12498915.html https://developer.aliyun.com/article/90390 https://blog.csdn.net/llh_1178/article/details/79329250 https://www.theobroma-systems.com/rk3399-q7-user-manual/04-software.html https://www.jianshu.com/p/0caef3ce8e06 https://gcc.gnu.org/install/ https://www.cnblogs.com/uestc-mm/p/7511063.html https://blog.csdn.net/xiexievv/article/details/50620170 https://zhuanlan.zhihu.com/p/107133028 https://www.jianshu.com/p/fc162672fae2 https://blog.csdn.net/u013946356/article/details/83106133