⑴ 如何判断提取出的ES流是真正的裸流
这个问题已经解决了!首先说一下,我提取出来的流不知道是不是完整的ES流,也即所谓的标准裸流,因为当时用VLC播放不了,所以我自己也不敢确定,怕自己提取的数据不完整什么的。除了版主提供的播放工具,再告诉大家一个方法,那就是用vlc-0.8.6i-win32这个版本的VLC,如果可以播放,就是纯正的裸流!注意,最新版本的VLC是不能播放264文件的!
⑵ 前端好还是后端
前后端应该都挺有发展前景,相对来说前端会比较简单一点。但是现在对于同个层次的人,一般公司前后端待遇都差不多,待遇好的肯定是你技术过硬的。那就要看自己的爱好了。以下是web前端开发和java后端开发两者的分析。
具体步骤
首先说JAVA,JAVA是作为后端开发的。现在后端开发主要是PHP和JAVA,当然还要加上数据库MySQL、Oracle。PHP比较适合交互比较少的后端,适合小规模的应用。JAVA做后端安全性、稳定性都较好,所以大、中企业用JAVA开发。当然后端开发还有C++等语言,C++的特点是开发快、成本低,一些手机游戏就用C++作为后端语言。
Web前端主要用的语言是Html5、CSS3、JavaScript,还要加上AJAX。前端开发还有什么前端呢?移动应用(APP)前端。2015年之前,开发APP的前端,要用android和IOS,而且还必须分别开发。
2015年开始,兴起了APP前端统一开发,比如MUI框架、react native。这两种开发我都涉及到,原生android我也做过几款APP。MUI开发用的就是Web前端的那一套东西,只不过封装了很多的类。react native开发模仿的就是Web前端开发,用的语言是ES5,ES6。你网络上查一查就知道ES跟JS其实没啥区别。
所以,要说哪个有前途。真不好说,因为这两个技术就是相辅相成的。现在学前端就是从 Web前端开始。但是对于个人来说,从事前端或者后端还是有区别的。前端开发,对于有美术功底的人是有优势的,后端开发适合编程技术功底扎实的人。
⑶ 前端是啥呢
前端即网站前台部分,运行在PC端,移动端等浏览器上展现给用户浏览的网页。简单地说,能够从 App 屏幕和浏览器上看到的东西都属于前端。前端技术一般分为前端设计和前端开发,前端设计一般可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括基本的HTML和CSS以及JavaScript/ajax,最新的高级版本HTML5、CSS3,以及SVG等。
⑷ 前端构建工具Gulp.js 你知多少..(webpack/gulp/grunt)
@ TOC
阅读本文章之前,相信你已经对前端构建工具(webpack、gulp、grunt)有一定的认知和了解了,那么他们之间究竟有什么区别呢?
gulp文档上面有这么一句话 ,也就是说 gulp是一个自动化构建工具;
gulp的一些功能如下(包括但不限于):
其实Webpack和另外两个并没有太多的可比性
傻瓜式起步照搬官网文档
1.安装
2.在项目根目录下创建一个名为 gulpfile.js 的文件:
3.运行 gulp:
默认的名为 default 的任务(task)将会被运行,在这里,这个任务并未做任何事情。
具体详情可以查看 gulpjs.com文档
新建一个项目gulp-test
环境:
1.新建文件以下文件如下
其中 gulpfile.js 是我们gulp的配置文件,启动gulp默认会找个这个文件并执行;
2.接下来安装依赖
一直按回车Enter初始化package.json文件(小技巧: npm iniy -y 可以免去繁琐的enter步骤)
此时我们的目录结构是这样了
安装依赖
这里页面实时刷新只讲这个 gulp-connect ,其他详情可以参照 Browsersync 和文章 gulp-livereload
安装完依赖后配置gulpfile.js如下:
大概讲解一下gulpfile.js:
gulp.task 是gulp的api 定义一个使用 Orchestrator 实现的任务(task)
如上我们定义了 my-task-js , my-task-css , html , clean , default , watch , server 等任务,其中:
my-task-js 是将 符合所提供的匹配模式的js 进行检测(gulp-jshint)、压缩(gulp-uglify)、合并(gulp-concat)、重命名(gulp-rename)、输出(gulp.dest)到/dist/js目录下;
my-task-css 是将 符合所提供的匹配模式的sass进行编译(gulp-sass)、压缩(gulp-uglify)、合并(gulp-concat)、重命名(gulp-rename)、输出(gulp.dest)到/dist/css目录下;
html 是将 符合所提供的匹配模式的html进行监听,如果有变化则connect.reload()
clean 是如果任务重新启动时 删除旧文件;
default gulp默认启动的任务
watch gulp的api 监视文件,并且可以在文件发生改动时候做一些事情。它总会返回一个 EventEmitter 来发射(emit) change 事件。
server 依赖gulp-connect启动一个服务器
配置完gulpfile.js之后,我们给js和css及html加点东西:
首先js/helloworld.js
css/index.scss
index.html
运行gulp
浏览器效果:
接下来我们修改helloworld.js来看看是否能实时刷新
修改如下:
按保存之后,终端给我们报了一个错:
查看js发现我们用了es6语法的声明语句 但当前gulp无法处理es6语法,有问题解决问题,es6=>es5
解决方案:
安装gulp-babel babel-core babel-preset-es2015
gulpfile.js修改如下:
运行
依然报上面的错;找了一些原因发现,虽然安装了相关依赖,却没有配置.babelrc文件,即babel还没转化es6
根目录添加.babelrc文件
重新运行:
查看dist下的js文件
改变helloworld.js检查页面是否刷新
保存,页面的天空蓝换成你们喜欢的yellow颜色
修改index.scss 查看是否会刷新页面
最后修改index.html 查看是否会刷新页面
今天主要学习了gulp的简单项目搭建及实时更新配置;其实gulp类似于grunt的弱化版,但更简单好用,只是插件会少一些,目前主流的项目搭建工具主要是webpack,但依然有不少项目还用着gulp或者grunt
扩展:
下面还有一些楼主的学习笔记:
有兴趣的可以多多交流@ 楼主博客
⑸ 前端面试计划(二)ES6“v2-附加代码”
## 01. 你能说说ES6有哪些内容吗?
- let、const- 模板字符串- 解构赋值- 扩展运算符- 字符串的扩展方法(includes, startsWith, endsWith, padStart, padEnd, repeat, replaceAll, trimStart, trimEnd...)- 数组的扩展方法(includes, isArray, from, fill, find, findIndex...)- 箭头函数- 函数的rest参数,函数参数的默认值- Symbol- Reflect- Proxy- Promise- Generator- Map- WeakMap- Set- WeakSet- class- import & export- ...
### Symbol
- Symbol 除了表示独一无二的值- 还具有元编程的能力,比如我们手写 Promise 的时候,如果不定义 Symbol.toStringTag 为 Symbol,那么通过 Object.prototype.toString.call 得到的结果就是 [object Object]- 还可以用于判断某对象是否为某构造器的实例 Symbol.hasInstance,很多人手写 instanceof 的时候都是通过 __proto__ 的方式,这在 ES5 是没问题的,然而在 ES6 是通过 Symbol.hasInstance
### Reflect
Reflect 将对象的操作集中起来,可以通过 Reflect. 的方式来使用,比如:- Reflect.ownKeys 可以获取对象的普通属性和Symbol类型的属性,如果不使用 Reflect.ownKeys() ,就要使用 Object.keys() 和 Object.getOwnPropertySymbols 将获取到的普通类型的属性和 Symbol 类型的属性拼接起来- Reflect.has 可以判断一个对象是否存在某个属性,如果不用 Reflect.has 就要使用 key in object
## 02. 箭头函数和普通函数有什么区别呢?
1. 箭头函数没有自己独立的作用域,即它的 this 指向它定义时的作用域2. 箭头函数没有 prototype 属性3. 箭头函数没有 arguments 和 caller4. 箭头函数不能作为构造函数
## 03. Map 和 WeakMap (Set 和 WeakSet) 的区别?
- WeakMap 的 key 只能是对象- WeakMap 没有 size 属性,没有 clear 方法,不支持遍历- WeakMap 是弱引用
## 04. 各种模块化规范的细节
- CommonJs
CommonJS 主要是 Node.js 使用,通过 require `同步加载`模块,exports 导出内容。在 CommonJS 规范下,每一个 JS 文件都是独立的模块,每个模块都有独立的作用域,模块里的本地变量都是私有的
- AMD(Asynchronous Mole Definition)
AMD,即异步模块定义。AMD定义了一套JavaScript模块依赖异步加载标准,用来解决浏览器端模块加载的问题。AMD主要是浏览器端使用,通过 define 定义模块和依赖,require 异步加载模块,推崇依赖前置
- CMD(Common Mole Definition)
CMD,即通用模块定义。CMD定义了一套JavaScript模块依赖异步加载标准,用来解决浏览器端模块架子啊的问题。CMD主要是浏览器端使用,通过 define 定义模块和依赖,require 异步加载模块,推崇依赖就近
- UMD(Universal Mole Definition)
UMD,即通用模块定义。UMD主要为了解决 CommonJS 和 AMD 规范下的代码不通用的问题,同时还支持将模块挂载到全局,是跨平台的解决方案
- ESM(ECMAScript Mole)
ESM,即ESMole。官方模块化规范,现代浏览器支持,通过 import 加载模块,export 导出内容
⑹ web前端es是什么意思
es就是ECMA是European Computer Manufacturers Association的缩写,即欧洲计算机制造商协会。欧洲计算机制造商协会是制定信息传输与通讯的国际化标准组织。
ECMAScript是ECMA制定的标准化脚本语言。
目前JavaScript使用的ECMAScript版本为ECMAScript-262。
ECMAScript被国际化标准组织采纳为ISO/IEC 16262。
⑺ 进行OPENGL | ES移植到开发板上,使用软件包PicoGL,最终编译完的程序在开发板上运行出错
换上对应的交叉编译工具,重新编译lib库。
⑻ 快毕业了,很多人都不推荐做前端,前端业内最真实情况是什么样的
一、从个人发展角度——前端是个比较“难积累经验”的领域
如何判断一个行业对个人发展是否有利?
最简单的就是从身边的人做对比,随着时间的积累,个人发展能否得到提升,让我觉得不安的是,一个工作了五年的腾讯前端工程师,跟工作两年的前端工程师,却很难有技术能力上的差异。
前端变化快,新技术新概念多,但也代表前端技术不稳定。这也是为什么知乎上的前端普遍都很“焦虑”。每次问及前端,都必须声明自己碾压活在底层的“切图仔”。
二、行业壁垒——对于普通人来说,前端天花板不高
很多人说现在的前端已经模块化,工具化,规范化了,有Webpack、Parcel、Eslint、React、Vue、Angular、PWA、Puppeteer、Electron各种技术等等,前端已经是一个非常工程化的东西了,区别于用jQuery的切图仔了!所以前端特别有竞争力!还有其他答主说前端入门很难,高级就不容易了!
其实前端还是一个相对比较新的行业,互联网发展早期(1995年~2005年)是没有专业的前端工程师的。随着互联网的发展,到了2010年,互联网开始全面进入移动时代,前端工程师的地位越来越重要。而前端的前景也十分的好。
前端薪资:有越来越高的趋势
前端开发依旧是刚需,所以你想要做web前端,是完全可以的,以上的回答给你参考
⑼ cygwin 中如何安装arm-linux-gcc交叉编译器
交叉编译工具链作为嵌入式Linux开发的基础,直接影响到嵌入式开发的项目进度和完成质量。由于目前大多数开发人员使用Windows作为嵌入式开发的宿主机,在Windows中通过安装VMware等虚拟机软件来进行嵌入式Linux开发,这样对宿主机的性能要求极高。Cygwin直接作为Windows下的软件完全能满足嵌入式Linux的开发工作,对硬件的要求低及方便快捷的特点成为嵌入式开发的最佳选择。
目前网络上Cygwin下直接可用的交叉编译器寥寥无几且版本都比较低,不能满足开源软件对编译器版本依赖性的要求(如低版本工具链编译U-Boot出现软浮点问题等);Crosstool等交叉工具链制作工具也是更新跟不上自由软件版本的进度;同时系统介绍Cygwin下制作交叉编译器方面的资料很少。针对上述情况,基于最新版gcc等自由软件构建Cygwin下的交叉编译器显得尤为迫切和重要。
构建前准备工作
首先Cygwin下必须保证基本工具比如make}gcc等来构建bootstrap-gcc编译器,这可以在安装Cygwin时选择安装。参照gcc等安装说明文档来在Cygwin下查看是否已经安装,如输入gcc --v等。
源码下载
gcc-4.5.0的编译需mpc的支持,而mpc又依赖gmp和mpfr库。从各个项目官方网站上下载的最新的源码:
binutils-2.20. l .tar.bz2
gmp-S.O. l .tar.bz2
mpc-0.8.2.tar.gz
mpfr-3.O.O.tar.bz2
gcc-4.S.O.tar.bz2
linux-2.6.34.tar.bz2
glibc-2.11.2.tar.bz2
glibc-ports-2. l l .tar.bz2
gdb-7. l.tar.bz2
设置环境变量
HOST:工具链要运行的目标机器;BUILD:用来建立工具链的机器;TARGET工具链编译产生的二进制代码可以运行的机器。
BUILD=i686-pc-cygwin
HOST=i686-pc-cygwin TARGET=arm-linux
SYSROOT指定根目录,$PREFIX指定安装目录。目标系统的头文件、库文件、运行时对象都将被限定在其中,这在交叉编译中有时很重要,可以防止使用宿主机的头文件和库文件。本文首选$SYSROOT为安装目录,$PREFIX主要作为glibc库安装目录。
SYSROOT=/cross-root
PREFIX=/cross-root/arm-linux
由于GCC-4.5.0需要mpfr,gmp,mpc的支持,而这三个库又不需要交叉编译,仅仅是在编译交叉编译链时使用,所以放在一个临时的目录。
TEMP_PREFIX=/build-temp
控制某些程序的本地化的环境变量:
LC ALL=POSIX
设置环境变量:
PATH=$SYSROOT/bin:儿in:/usr/bin
设置编译时的线程数f31减少编译时间:
PROCS=2
定义各个软件版本:
BINUTILS V=2.20.1
GCC V=4.5.0
GMP V=5.0.1
MPFR V=3.0.0
MPC V二0.8.2
LINUX V二2.6.34
GLIBC V=2.11.2
GLIBC-PORTS V=2.11
GDB V=7.1
构建过程详解
鉴于手工编译费时费力,统一把构建过程写到Makefile脚本文件中,把其同源码包放在同一目录下,执行make或顺次执行每个命令即可进行无人值守的编译安装交叉工具
链。以下主要以Makefile执行过程为主线进行讲解。
执行“make”命令实现全速运行
可在Cygwin的Shell环境下执行“make>make.log 2>&1”命令把编译过程及出现的错误都输出到make.log中,便于查找:
all:prerequest install-deps install-cross-stage-one install-
cross-stage-two
预处理操作
"make prerequest',命令实现单步执行的第一步,实现输出变量、建立目录及解压源码包等操作。0'set十h”关闭bash的Hash功能,使要运行程序的时候,shell将总是搜索PATH里的目录[4]。这样新工具一旦编译好,shell就可以在$(SYSROOT)/bin目录里找到: prerequest:
set +h&&mkdir -p $(SYSROOT)/bin&&
mkdir -p $(PREFIX)/include&&
mkdir -p $(TEMP一REFIX)&&
export PATH LCes ALL&&
tar -xvf gmp-$(GMP_V).tar.bz2&&
tar -xvf mpfr-$(MPFR_V).tar.bz2&&
tar -xvf mpc-$(MPC_V).tar.gz&&
tar -xvf binutils-$(BINUTILS_V).tar.bz2&&
tar -xvf gcc-$(GCC_V).tar.bz2&&
tar -xvf linux-$(LINUX_V).tar.bz2&&
tar -xvf glibc-$(GLIBC_V).tar.bz2&&
tar -xvf glibc-ports-$(GLIBC-PORTS_V).tar.bz2&&
my glibc-ports-$(GLIBC-PORTS_V)
glibc-$(GLIBC_V)/ports&&
tar -xvf gdb-$(GDB V).tar.bz2
非交叉编译安装gcc支持包mpc
00make install-deps”命令实现单步执行的第二步,实现mpc本地编译,mpc依赖于gmp和mpfr
install-deps:gmp mpfr mpc
gmp:gmp-$(GMP_V)
mkdir -p build/gmp&&cd build/gmp&&
../../gmp-*/configure
--disable-shared --prefix=$(TEMP_PREFIX)&&
$(MAKE)一$(PROCS)&&$(MAKE) install
mpfr:mpfr-$(MPFR_V)
mkdir -p b-uild/mpfr&&cd build/mpfr&&
../..//mpfr-*/configure
LDF'LAGS="-Wl,-search_paths_first”--disable-shared
--with-gmp=$(TEMP_PREFIX)
--prefix=$(TEMP_PREFIX)&&
$(MAKE)一$(PROCS) all&&$(MAKE) install
mpc: mpc-$(MPC_V) gmp mpfr
mkdir -p build/mpc&&cd build/mpc&&
../../mpc-*/configure
--with-mpfr=$(TEMP PREFIX)
--with-gmp=$(TEMP_PREFIX)
--prefix=$(TEMP_PREFIX)&&
$(MAKE)一$(PROCS)&&$(MAKE) install
交叉编译第一阶段
"make install-cross-stage-one',命令实现单步执行的第三步,编译安装binutils,bootstrap-gcc和获取Linux内核头文件:
install-cross-stage-one:cross-binutils cross-gcc get-kernel-headers
编译安装binutils
cross-binutils: binutils-$(BINUTILS_ V)
mkdir -p build/binutils&&cd build/binutils&&
../..//binutils-*/configure --prefix=$(SYSROOT)
--target=$(TARGET)--disable-nls&&
$(MAKE)j$(PROCS)&&$(MAKE) install
编译安装bootstrap-gcc。使用一disable-shared参数的意思是不编译和安装libgcc_ eh.a文件。glibc软件包依赖这个库,因为它使用其内部的一lgcc_eh来创建系统[6]。这种依赖
性,可通过建立一个指向libgcc.a符号链接得到满足,因为该文件最终将含有通常在libgcc- eh.a中的对象(也可通过补丁文件实现)。
cross-gcc:gcc-$(GCC_V)
mkdir -p build/gcc&&cd build/gcc&&
二//gcc-*/configure
--target=$(TARGET)--prefix=$(SYSROOT)
--disable-nls --disable-shared --disable-multilib
--disable-decimal-float--disable-threads
--disable-libmudflap --disable-libssp
--disable-libgomp --enable-languages=c
--with-gmp=$(TEMP_PREFIX)
--with-mpfr=$(TEMP_PREFIX)
--with-mpc=$(TEMP_PREFIX)&&
$(MAKE) -j$(PROCS)&&$(MAICE) install&&
In -vs libgcc.a'arm-linux-gcc -print-libgcc-file-name I
sed's/libgcc/& eh/'}
获取Linux内核头文件:
get-kernel-headersainux-$(LINUX_V)
cd linux-$(LINUX_V)&&
$(MAICE) mrproper&&$(MAKE) headers check&&
$(MAKE) ARCH=arm&&
INSTALLes HDR_ PATH=dest headers_ install&&
find dest/include
(-name .install一。-name ..installNaNd)-delete&&
cp -rv desdinclude/* $(PREFIX)/include
交叉编译第二阶段
编译安装glibc、重新编译安装binutils、完整编译安装gcc和编译安装gdb o "make install-cross-stage-two',命令实现单步执行的第四步: install-cross-stage-two:cross-glibc cross-rebinutils cross-g++ cross-gdb
编译安装glibca glib。的安装路径特意选为$(PREFIX),与gcc更好找到动态链接库也有关系,选在$(SYSROOT)提示找不到crti.o; glibc已经不再支持i386; glibc对ARM等的处理器的支持主要通过glibc-ports包来实现;正确认识大小写敏感(Case Sensitive)和大小写不敏感(CaseInsensitive)系统,大小写敏感问题主要影响到glibc,是交叉编译glibc成功的关键:Cygwin帮助手册中可知Cygwin是默认大小写不敏感的n},但是UNIX系统是大小写敏感的,这也是Cygwin和UNIX类系统的一个区别。通过作者自行参考制作的glibc-2.11.2-cygwin.patch补T使glibc变为Case-Insensitive,此补丁主要是对大小写敏感问题改名来实现。
交叉编译过程中安装的链接器,在安装完Glibc以前都无法使用。也就是说这个配置的forced unwind支持测试会失败,因为它依赖运行中的链接器。设置libc_ cvforced unwind=yes这个选项是为了通知configure支持force-unwind,而不需要进行测试。libc cv_c_cleanup=yes类似的,在configure脚本中使用libc_cv_c cleanup=yes,以便配置成跳过测试而支持C语言清理处理。
cross-glibc:glibc-$(GLIBC_V)
cd glibc-$(GLIBC_V)&&
patch -Np 1 –i...//glibc-2.11.2-cygwin.patch&&
cd..&&mkdir -p build/glibc&&
cd build/glibc&&
echo"libc cv_forcedes unwind=yes">config.cache&&
echo "libc cv_c_cleanup=yes">>config.cache&&
echo "libc cv_arm_tls=yes">>config.cache&&
../../glibc-*/configure --host=$(TARGET)
--build=$(../OneScheme/glibc-2.11.2/scripts/config.guess)
--prefix=$(PREFIX)--disable-profile
--enable-add-ons --enable-kernel=2.6.22.5
--with-headers=$(PREFIX)/include
--cache-file=config.cache&&
$(MAKE)&&$(MAKE) install
重新编译安装binutils。编译之前要调整工具链,使其
指向新生成的动态连接器。
调整工具链:
SPECS=
'dirname $(arm-linux-gcc -print-libgcc-file-name)'/specs
arm-linux-gcc -mpspecs
sed -e 's@/lib(64)\?/ld@$(PREFTX)&@g' -e ,}/}}*cPP}$/{n;s,$,-isystem $(PREFIX)/include,}"
>$SPECS
echo "New specs file is: $SPECS"
unset SPECS
测试调整后工具链:
echo 'main(川’>mmy.c
arm-linux-gcc
-B/cross-root/arm-linux/lib mmy.c
readelf -1 a.out I grep’:/cross-roobarm-linux'
调整正确的输出结果:
[Requesting program interpreter: /tools/lib/ld-linux.so.2j
一切正确后删除测试程序:
rm -v mmy.c a.out
重新编译binutils。指定--host,--build及--target,否则配置不成功,其config.guess识别能力不如gcc做的好。
cross-rebinutils: binutils-$(BINUTILS_V)
mkdir -p build/rebinutils&&
cd build/rebinutils&&CC="$(TARGET)-gcc
-B/cross-roodarm-linux/lib/"&&AR=$(TARGET)-ar&&
RANLIB=$(TARGET)-ranlib&&../..//binutils-*/configure
--host=$(HOST)--build=$(BUILD)--target=$(TARGET)
--prefix=$(SYSROOT)--disable-nls
--with-lib-path=$(PREFIX)/lib&&
$(MAKE)--$(PROCS)&&$(MAKE) install
高于4.3版的gcc把这个编译当作一个重置的编译器,并且禁止在被一prefix指定的位置搜索startfiles。因为这次不是重置的编译器,并且$(SYSROOT)目录中的startfiles对于创
建一个链接到$$(SYSROOT)目录库的工作编译器很重要,所以我们使用下面的补丁,它可以部分还原gcc的老功能tai . patch -Npl –i../gcc-4.5.0-startfiles_fix-l.patch
在正常条件下,运行gcc的fixincludes脚本,是为了修复可能损坏的头文件。它会把宿主系统中已修复的头文件安装到gcc专属头文件目录里,通过执行下面的命令,可以抑
制fixincludes脚本的运行[9](此时目录为/gcc-4.5.0)。
cp -v gcc/Makefile.in{,.orig}
sed 's@\./fixinc\.sh@-c true@'
gcc/Makefile.in.orig > gcc/Makefile.in
下面更改gcc的默认动态链接器的位置,使用已安装在/cross-root/ann-linux目录下的链接器,这样确保在gcc真实的编译过程中使用新的动态链接器。即在编译过程中创建的所有
二进制文件,都会链接到新的glibc文件
for file in
$(find gcc/config -name linux64.h-o -name linux.h –o -name sysv4.h)
do cp -uv $file{,.orig}
sed -a 's@/lib(64)?(32)?/Id@/cross-root/arm-linux&@g’-e's@/usr@/cross-rootlarm-linux@g' $file.orig>$file echo‘
#undef STANDARD INCLUDE DIR
#define STANDARD_ INCLUDE DIR "/cross-root/arm-linux/include"
#define STANDARD STARTFILE PREFIX 1 "/cross-root/arm-linux/lib"
#define STANDARD_ STARTFILE_ PREFIX_ 2””’>>$file
touch $file.orig done
完整编译安装gcc。最好通过指定--libexecdir更改libexecdir到atm-linux目录下。--with-local-prefix选项指定gcc本地包含文件的安装路径此处设为$$(PREFIX),安装后就会在内核头文件的路径下。路径前指定$(Pwd)则以当前路径为基点,不指定则默认以/home路径为基点,这点要注意。
cross-g++:gcc-$(GCC-)
mkdir -p build/g十+&&cd build/g++&&
CC="$(TARGET)-gcc AR=$(TARGET)-ar&&
-B/cross-roodarm-linux/lib/"&&
RANLIB=$(TARGET)-ranlib&&
..//gcc-*/configure
--host=$(HOST)--build=$(BUILD)--target=$(TARGET)
--prefix=$(SYSROOT)--with-local-prefix=$(PREFIX)
--enable-clocale=gnu --enable-shared
--enable-threads=posix --enable -cxa_atexit
--enable-languages=c,c++--enable-c99
--enable-long-long --disable-libstdcxx-pch
--disable-libunwind-exceptions
--with-gmp=$(TEMP_PREFIX)
--with-mpfr=$(TEMP_PREFIX)
--with-mpc=$(TEMP_PREFIX)&&
$(MAKE) LD_IBRARY_ATH=
$(pwd)/$(../../gcc-4.5.0/config.guess)/libgcc&&
$(MAKE) install
编译安装gdb,至此完成整个工具链的制作。
cross-gdb: gdb-$(GDB V)
mkdir -p build/gdb&&cd build/gdb&&
../../gdb-*/configure --prefix=$(SYSROOT)
--target=$(TARGET)--disable-werror&&
$(MAKE)-j$(PROCS)&&$(MAKE) install
“make clean”命令清除编译生成的文件和创建解压的文件夹
.PHONY:clean
dean:
rm -fr $(TEMP_PREFIX) build
binutils-$(BINUTIL,S_V) gcc-$(GCC_V)
glibc-$(NEWL.IB_V) gdb-$(GDB_V)
gmp-$(GMP_V) mpc-$(MPC_V) mpfr-$(MPFR_V)
工具链测试
命令行中输入以下内容:
echo 'main(){}’>mmy.c
arm-linux-gcc -o mmy.exe mmy.c
file mmy.exe
运行正常的结果:
mmy.exe: ELF 32-bit LSB executable, ARM, version 1,for GNU/Linux 2.6.22, dynamically linked (uses shared libs),not stripped.
⑽ 利用father build 开发前端组件库实战
我们的目标是建立一个前端组建库, 使用的技术栈是father+docz,同时要支持typescript, 在build出来的es目录中要能够生成“.d.ts”后缀的类型声明文件,因为只有生成类型声明文件,我们在使用自己开发的组件库的时候才能获得更好的开发体验。
之所以写下这篇文章,是因为自己在使用father-build建设内部组件库的过程中,遇到了一些问题且难以找到相关文档,将自己的经验总结下来希望看到这篇文章的人能避开这些坑,更加顺利地搭建好自己的前端组件库。
package.json
其中,main指定了入口文件,mole对应es mole的输出,types对应你的typings文件,这样在组件在被使用的时候编辑器才能识别出你的组件类型声明
.fatherrc.js 配置father build打包方式, 具体详情可以参考 umijs/father
tsconfig.json typescript的配置文件,注意只有declaration设置为true才能生成.d.ts后缀的文件
接下来我们在components目录创建第一个自己的组件,下面是一个button的例子:
样式文件可以直接使用less编写
然后在入口文件index.ts将其导出,暴漏给外部使用。
使用文档的后缀名为".mdx", 语法与markdown类似,更多详情参考 docz 的文档
我们可以执行 yarn start ,来实时查看文档的效果。
现在命令行执行 yarn build 即可对组件库进行打包了,注意我们在.fatherrc中配置了esm和cjs两种打包方式,对应会生成 es 和 lib两个目录,其中 esm对应的是 es目录,cjs对应lib目录。
正常情况下,在的es和lib目录下应该已经为我们写的ts源码自动生成了“.d.ts”后缀的类型声明文件,如果没有生成,请仔细对比.fatherrc.js和tsconfig.json这两个配置文件,另外还要注意的是,如果我们基于antd封装业务组件库的话,不要在组件库中使用css mole,否则也会造成无法自动产生类型声明文件的问题。
文章未能详尽部分,可以参考这个demo的github源码地址: https://github.com/xitengfei/xui-components , 有问题欢迎批评指正。