为了账号安全,请及时绑定邮箱和手机立即绑定
4. AS 如何查看编译报错信息

我们在编译时经常会遇到一些报错信息,但是有时候会排查很久才知道原因所在。其实编译时的信息在 Gradle 日志中我们都可以看到。当我们编译时,在 AndroidStudio 的左下角会看到如下一个 Build 按钮:当我们点击 Build 按钮,我们点击这个按钮就会看到具体的日志信息。我们就可以看到具体的错误日志了,具体我们可以搜FAILURE: Build failed with an exception.这句后面接着的就是具体的错误信息,包括出错文件及原因。我们这里看到说图片文件的名称只能是数字和小写字母,这里包含了 A 这个大写字母,所以编译的时候抛出了异常。Tips: 当我们遇到编译报错时,我们可以在 Build 这个窗口中输入 FAILURE: Build failed with an exception. 搜索到这句信息的位置,后面紧接着的就是具体的错误信息。

2. 编译选项

选项类型默认值描述–allowJsbooleanfalse允许编译 JavaScript 文件–allowSyntheticDefaultImportsbooleanfalse允许从没有设置默认导出的模块中默认导入–allowUnreachableCodebooleanfalse不报告执行不到的代码错误–allowUnusedLabelsbooleanfalse不报告未使用的标签错误–alwaysStrictbooleanfalse以严格模式解析并为每个源文件生成 "use strict" 语句--baseUrlstring解析非相对模块名的基准目录–charsetstring“utf8”输入文件的字符集–checkJsbooleanfalse在 .js 文件中报告错误,与 --allowJs 配合使用–declaration -dbooleanfalse生成相应的 .d.ts 文件–declarationDirstring生成声明文件的输出路径–diagnosticsbooleanfalse显示诊断信息–disableSizeLimitbooleanfalse禁用 JavaScript 工程体积大小的限制–emitBOMbooleanfalse在输出文件的开头加入BOM头(UTF-8 Byte Order Mark)–emitDecoratorMetadata[1]booleanfalse给源码里的装饰器声明加上设计类型元数据。查看 issue #2577 了解更多信息。–experimentalDecorators[1]booleanfalse启用实验性的ES装饰器–extendedDiagnosticsbooleanfalse显示详细的诊断信息–forceConsistentCasingInFileNamesbooleanfalse禁止对同一个文件的不一致的引用–help -h打印帮助信息–importHelpersstring从 tslib 导入辅助工具函数(比如 __extends, __rest等)–inlineSourceMapbooleanfalse生成单个 sourcemaps 文件,而不是将每 sourcemaps 生成不同的文件–inlineSourcesbooleanfalse将代码与 sourcemaps 生成到一个文件中,要求同时设置了 --inlineSourceMap 或 --sourceMap 属性--init初始化 TypeScript 项目并创建一个 tsconfig.json 文件–isolatedModulesbooleanfalse将每个文件作为单独的模块(与 “ts.transpileModule” 类似)–jsxstring“Preserve”在 .tsx 文件里支持 JSX: “React” 或 “Preserve”。–jsxFactorystring“React.createElement”指定生成目标为 react JSX 时,使用的 JSX 工厂函数,比如 React.createElement 或 h–libstring[]编译过程中需要引入的库文件的列表。 可能的值为: ► ES5 ► ES6 ► ES2015 ► ES7 ► ES2016 ► ES2017 ► ES2018 ► ESNext ► ES5 ► ES5 ► ES5 ► ES5 ► ES5 ► ES5 ► DOM ► DOM.Iterable ► WebWorker ► ScriptHost ► ES2015.Core ► ES2015.Collection ► ES2015.Generator ► ES2015.Iterable ► ES2015.Promise ► ES2015.Proxy ► ES2015.Reflect ► ES2015.Symbol ► ES2015.Symbol.WellKnown ► ES2016.Array.Include ► ES2017.object ► ES2017.Intl ► ES2017.SharedMemory ► ES2017.String ► ES2017.TypedArrays ► ES2018.Intl ► ES2018.Promise ► ES2018.RegExp ► ESNext.AsyncIterable ► ESNext.Array ► ESNext.Intl ► ESNext.Symbol 注意:如果 --lib 没有指定默认注入的库的列表。默认注入的库为: ► 针对于 --target ES5:DOM,ES5,ScriptHost ► 针对于 --target ES6:DOM,ES6,DOM.Iterable,ScriptHost–listEmittedFilesbooleanfalse打印出编译后生成文件的名字–listFilesbooleanfalse编译过程中打印文件名–localestring(platform specific)显示错误信息时使用的语言,比如:en-us–mapRootstring为调试器指定指定 sourcemap 文件的路径,而不是使用生成时的路径。当 .map 文件是在运行时指定的,并不同于 js 文件的地址时使用这个标记。指定的路径会嵌入到 sourceMap 里告诉调试器到哪里去找它们–maxNodeModuleJsDepthnumber0node_modules 依赖的最大搜索深度并加载 JavaScript 文件,仅适用于 --allowJs–module -mstringtarget === “ES6” ? “ES6” : “commonjs”指定生成哪个模块系统代码: “None”, “CommonJS”, “AMD”, “System”, “UMD”, "ES6"或 “ES2015”。 ► 只有 "AMD"和 "System"能和 --outFile一起使用。 ► "ES6"和 "ES2015"可使用在目标输出为 "ES5"或更低的情况下。–moduleResolutionstringmodule === “AMD” or “System” or “ES6” ? “Classic” : “Node”决定如何处理模块。或者是 “Node” 对于 Node.js/io.js,或者是 “Classic”(默认)–newLinestring(platform specific)当生成文件时指定行结束符: "crlf"(windows)或 "lf"(unix)–noEmitbooleanfalse不生成输出文件–noEmitHelpersbooleanfalse不在输出文件中生成用户自定义的帮助函数代码,如 __extends–noEmitOnErrorbooleanfalse报错时不生成输出文件–noErrorTruncationbooleanfalse不截短错误消息–noFallthroughCasesInSwitchbooleanfalse报告 switch 语句的 fallthrough 错误。(即,不允许 switch 的 case 语句贯穿)--noImplicitAnybooleanfalse在表达式和声明上有隐含的 any 类型时报错–noImplicitReturnsbooleanfalse不是函数的所有返回路径都有返回值时报错–noImplicitThisbooleanfalse当 this 表达式的值为 any 类型的时候,生成一个错误–noImplicitUseStrictbooleanfalse模块输出中不包含 “use strict” 指令–noLibbooleanfalse不包含默认的库文件( lib.d.ts )–noResolvebooleanfalse不把 /// <reference``> 或模块导入的文件加到编译文件列表–noStrictGenericChecksbooleanfalse禁用在函数类型里对泛型签名进行严格检查–noUnusedLocalsbooleanfalse若有未使用的局部变量则抛错–noUnusedParametersbooleanfalse若有未使用的参数则抛错--outDirstring重定向输出目录–outFilestring将输出文件合并为一个文件,合并的顺序是根据传入编译器的文件顺序和 ///<reference``> 和 import 的文件顺序决定的–skipDefaultLibCheckbooleanfalse忽略库的默认声明文件的类型检查–skipLibCheckbooleanfalse忽略所有的声明文件( *.d.ts )的类型检查--sourceMapbooleanfalse生成相应的 .map 文件–sourceRootstring指定 TypeScript 源文件的路径,以便调试器定位。当 TypeScript 文件的位置是在运行时指定时使用此标记, 路径信息会被加到 sourceMap 里--strictbooleanfalse启用所有严格类型检查选项–strictFunctionTypesbooleanfalse禁用函数参数双向协变检查–strictPropertyInitializationbooleanfalse确保类的非 undefined 属性已经在构造函数里初始化。若要令此选项生效,需要同时启用 --strictNullChecks--strictNullChecksbooleanfalse在严格的 null 检查模式下,null 和 undefined 值不包含在任何类型里,只允许用它们自己和 any 来赋值(有个例外, undefined 可以赋值到 void)–stripInternal[1]booleanfalse不对具有 /** @internal */ JSDoc注解的代码生成代码–suppressExcessPropertyErrors[1]booleanfalse阻止对对象字面量的额外属性检查–suppressImplicitAnyIndexErrorsbooleanfalse阻止 --noImplicitAny 对缺少索引签名的索引对象报错。查看 issue #1232 了解详情。--target <br> -tstring“ES3”指定ECMAScript目标版本 "ES3"(默认), "ES5", "ES6"/ "ES2015", "ES2016", "ES2017" 或 "ESNext"。 注意: "ESNext" 最新的生成目标列表为 ES proposed features–traceResolutionbooleanfalse生成模块解析日志信息–typesstring[]要包含的类型声明文件名列表–typeRootsstring[]要包含的类型声明文件路径列表--version <br> -v打印编译器版本号–watch -w在监视模式下运行编译器。会监视输出文件,在它们改变时重新编译。监视文件和目录的具体实现可以通过环境变量进行配置[1] 这些选项是试验性的

2.1 编译

编译语法aapt2 compile path-to-input-files [options] -o output-directory/在以下示例中,AAPT2 分别编译了名为 strings.xml 和 myImage.png 的资源文件:aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/如上表中所示,输出文件的名称取决于输入文件的名称及其父目录(资源类型和配置)的名称。对于以 strings.xml 作为输入的上述示例,aapt2 会自动将输出文件命名为 values-en_strings.arsc.flat。另一方面,存储在 drawable 目录中的已编译可绘制对象文件的文件名将为 drawable_img.png.flat。编译选项命令选项说明-o指定已编译资源的输出路径。–dir指定要在其中搜索资源的目录。–pseudo-localize生成默认字符串的伪本地化版本,如 en-XA 和 en-XB。–no-crunch停用 PNG 处理。–legacy将使用早期版本的 AAPT 时允许的错误视为警告。-v启用详细日志记录。

2. 使用 less

修改 package.json 中的 scripts 配置项。// package.json"scripts": { "compile": "lessc style.less style.css"},完成后再新建几个测试用的文件。一个是 index.html,另一个是 style.less。<!-- index.html --><!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>less</title> <link rel="stylesheet" href="style.css"></head><body> <div class="container"> 我是一个文本节点 <p>我是一个段落 <a href="//immoc.com">我是个超链接啦</a></p> </div></body></html>// style.less.container { color: red; p { color: blue; a { color: green; } }}index.html 中要引入 .css 文件,而不是 .less 文件。观察 compile 命令,意思就是 用less编译器将将 style.less 进行编译,然后输出到 style.css,所以 index.html 要引入 style.css。一切就绪后就 npm run compile !。执行后目录下就会多一个 style.css 文件。.container { color: red;}.container p { color: blue;}.container p a { color: green;}打开 index.html 就可以发现样式生效了。其实 style.less 的内容不解释,自己摸索也很容看出是什么意思,这是一种嵌套语法,通过嵌套的关系来对应节点的关系。嵌套 是最常用的特性,个人认为也是预处理器中最重要的特性,其实许多前端开发者也只会用到变量、嵌套两个特性。

1. 获取错误报告

错误报告包含设备日志、堆栈轨迹和其他诊断信息,可以帮助我们查找和修复应用中的错误。我们可以通过以下几种方式从设备上获取错误报告。

6. 重复声明报错

let 不允许在同一个函数或块作用域中重复声明同一个变量,否则会引起语法错误(SyntaxError)。{ let x = 10; let x = 11;}// Uncaught SyntaxError: Identifier 'x' has already been declared在上面的代码中报错,所以,同一个变量名不可以在同一个作用域内重复声明。{ let x = 10; var x = 1;}即使使用 var 去声明也是不可以的,我们知道当使用 let 声明的时候 x 已经是一个死区了,不可以被重复声明了。Tips:注意在 switch 语句中只有一个块级作用域,所以下面这种情况也是会报错的。let x = 1;switch(x) { case 0: let num; break; case 1: let num;//重复声明了 break;}// 报错如果把 case 后面的语句放到块作用域中则不会报错。let x = 1;switch(x) { case 0: {//块 let num; break; } case 1: {//块 let num;//这里就没有关系了,可以正常声明 break; }}上方代码,case 后面的语句 let 变量声明在放到块中,是单独的作用域,所以就不会报错。

1. 安装 less

less 也可以通过 npm 进行安装。先在一个空目录初始化项目,然后安装 less。npm init -ynpm i less -D

4. 编译库

如果你正在开发一个供其他 Kotlin 应用程序使用的库,那么可以构建 .jar 文件,而不将 Kotlin 运行时包含在其中。kotlinc hello.kt -d hello2.jar可以通过 jar 查看工具来看:相比下面这种运行时方式编译后的产物是不一样的,下面包含一个运行时打包:kotlinc hello.kt -include-runtime -d hello.jar可以通过 jar 查看工具来看:由于以这种方式编译的二进制文件依赖于 Kotlin 运行时,因此无论何时使用编译库,都应确保后者存在于类路径中。还可以使用 kotlin 脚本来运行 Kotlin 编译器生成的二进制文件:kotlin -classpath hello.jar HelloKt # HelloKt 是 Kotlin 编译器为名为 hello.kt 的文件生成的主类名。

2. 错误报告文件内容

默认情况下,错误报告是 ZIP 文件。ZIP 文件名类似 bugreport-BUILD_ID-DATE.zip,它可能会包含多个文件,但最重要的文件是 bugreport-BUILD_ID-DATE.txt。此文件就是错误报告,它包含系统服务 (dumpsys)、错误日志 (dumpstate) 和系统消息日志 (logcat) 的诊断输出。系统消息包括设备抛出错误时的堆栈轨迹,以及从所有应用中使用 Log 类写入的消息。ZIP 文件中有一个 version.txt 元数据文件,其中包含 Android 版本号,而且启用 systrace 后,ZIP 文件中还会包含 systrace.txt 文件。Systrace 工具可以获取并显示应用进程和其他 Android 系统进程的执行时间,从而帮助分析应用的性能。dumpstate 工具会将文件从设备的文件系统复制到 ZIP 文件的 FS 文件夹下,以便我们引用它们。例如,设备中的 /dirA/dirB/fileC 文件会在 ZIP 文件中生成 FS/dirA/dirB/fileC 条目错误报告文件结构如下:

TypeScript 编译选项

TypeScript 提供了很多不同功能的编译选项,既可以通过配置 tsconfig.json 文件中的 compilerOptions 属性来实现编译,也可以使用在 tsc 命令后跟随参数这形式,直接编译 .ts 文件。注意: 当命令行上指定了输入文件时,tsconfig.json 文件会被忽略。

1. 编译程序

大家可能有个疑问,为什么需要编译程序呢?计算机不能直接执行我们编写的源代码吗?这是由于计算机只能识别由0和1组成的二进制代码。需要通过编译将源代码转换为计算机认识的二进制代码。

1.3 在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量

public static void main(String...s){ int delta = -1; BinaryOperator<Integer> add = (delta, y) -> delta + y + delta; //编译报错 add.apply(1,2); }我们将表达式的第一个参数的名称由 x 改为 delta 时,编译器会报错说:Variable 'delta' is already defined in the scope

Android Studio 如何分析错误报告

前面的小节我们介绍了调试布局方面的知识,可以有效的帮助我们解决布局显示异常,本小结我们学习如何获取和分析错误报告。

1.7 编译运行

功能说明Windows/LinuxMac编译Ctrl+F9Command+F9编译并运行Shift+F10Ctrl+R应用更改并重启 ActivityCtrl+F10Ctrl+Command+R应用代码更改Ctrl+Alt+F10Ctrl+Shift+Command+R

1.3 常见错误

在编码过程中,要特别注意变量不要超出其类型的范围,请查看如下示例:432运行结果:int 类型能够存储的最大值为2147483647-2147483648我们发现 int 类型能存储的最大值加 1 之后,变成了一个负数,这个数其实就是 int 类型能够存放的最小值,这是因为加 1 之后变量超出了 int 类型能够存储的最大值,这就是我们常常说的内存溢出错误。还要特别注意一点,由于 Java 是强类型的,每个变量都有一个类型,只有给定种类的值能够存储到该变量中。例如,不能将浮点型的数字赋值给整型变量:public class IncompatibleTypeError{ public static void main(String[] args) { int age; age = 20.5f; }}源代码在编译阶段就会报错:$ javac IncompatibleTypeError.javaIncompatibleTypeError.java:4: 错误: 不兼容的类型: 从float转换到int可能会有损失 age = 20.5f; ^1 个错误

1.1 Java 中的编译

在 Java 中,程序不是直接被编译为可执行文件,而是被编译为字节码文件, JVM(Java虚拟机)在运行时执行字节码文件。当我们使用 javac 编译器时,Java 源代码文件被编译为字节码文件,字节码文件以扩展名 .class 的形式保存在磁盘上。当程序运行时,字节码文件将被转换为机器代码,并在内存中执行。总的来说,Java 源代码需要被“转换”两次才能被计算机执行:Java 源代码被编译为字节码:由 javac 前端编译器完成;字节码被编译为机器码:由 JVM 的执行引擎完成。下图描述了一个Java程序从编写到编译,再到执行的步骤:

3. Less 插件

这里只是拿less作为一个例子,事实上还有其他选择,比如sass,stylus等。

6.1 final 作用于类

当 final 关键字用于类上面时,这个类不会被其他类继承:final class FinalClass { public String name;}// final类不能被继承,编译会报错public class SubClass extends FinalClass { }编译执行,将会报错:SubClass.java:1: 错误: 无法从最终FinalClass进行继承public class SubClass extends FinalClass { ^1 个错误

1.2 在 Lambda 表达式当中被引用的变量的值不可以被更改

在 Lambda 表达式中试图修改局部变量是不允许的,那么我们在后面对 delta 赋值会怎么样呢?public static void main(String...s){ int delta = -1; BinaryOperator<Integer> add = (x, y) -> x+y+ delta; //编译报错 add.apply(1,2); delta = 2;}这个时候编译器会报错说:Variable used in lambda expression should be final or effectively final

2. 什么是条件编译

条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同平台。写法:以 #ifdef 或 #ifndef 加 %PLATFORM% 开头,以 #endif 结尾。实例:// 表示代码仅在 H5 平台上面执行,其他平台不执行#ifdef H5 需条件编译的代码#endif// 表示代码在 H5 平台上面不执行,其他平台上面执行#ifndef H5 需条件编译的代码#endif// 表示代码在 H5 平台和 App 平台上面执行,其他平台上面不执行#ifndef H5 || APP-PLUS 需条件编译的代码#endif这样可能也比较抽象,下面我们用前面小节做的登录弹窗给大家举个实际项目的例子。

6.2 final 作用于方法

当父类中方法不希望被重写时,可以将该方法标记为 final:class SuperClass { public final void finalMethod() { System.out.println("我是final方法"); }}class SubClass extneds SuperClass { // 被父类标记为final的方法不允许被继承,编译会报错 @Override public void finalMethod() { }}编辑执行,将会报错:SubClass.java:4: 错误: SubClass中的finalMethod()无法覆盖SuperClass中的finalMethod() public void finalMethod() { ^ 被覆盖的方法为final1 个错误

3.1 在编译器判断

平台之间的差异在讲条件编译的时候也说过,可以通过条件编译使特定的代码只运行在对应平台上。条件编译里面的代码,只会编译到对应平台的发行包里面,其他平台发行包不会包含条件编译的代码。比如说下面的代码,只会编译到 H5 的发行包里面,其他平台的发行包不会包含下面代码。实例:// #ifdef H5 console.log("只有 H5 平台才能打印这句话")// #endif

1. C 语言编译器

每个语言都需要编译器,甚至包括可以直接操作 CPU 内部寄存器的汇编语言。编译器的作用就是将我们用接近人类自然语言编写的程序翻译成计算机可以直接执行的二进制文件。其实使用二进制是人类在计算机发明过程中妥协于工程实践的一个行为。因为从最高效率的数字进制来说,三进制其实更为有效率,但是实现起来不那么容易。C 语言的编译器有非常多种,下面我们列举了一些,供大家参考。编译器编译器作者支持的操作系统是否有相关的集成开发环境授权许可类型AMPCAxiomatic Solutions Sdn BhdWindows,Unix & OtherYesProprietaryAmsterdam Compiler KitAndrew Tanenbaum and Ceriel JacobsUnix & OtherNoBSDCCS C CompilerCCS, Inc.Windows,Unix & OtherYesProprietaryClangLow-Level Virtual MachineWindows,Unix & OtherNoBSDDMS Software Reengineering ToolkitSemantic DesignsWindows,Unix & OtherNoProprietaryGCC CGNU ProjectWindows,Unix,IBM mainframe, AmigaOS, VAX/VMS, RTEMSNoGPLRCC (RCOR C Compiler)Rodrigo Caetano (rcor)Windows,UnixNoGPLInteractive CKISS Institute for Practical RoboticsWindows, Unix, Mac, Linux, IRIX,Solaris, SunOSNoLabWindows/CVINational InstrumentsWindows,Unix & OtherYesProprietarylccChris Fraser and David HansonWindows,Unix & OtherWindows onlyFreeware (source code available for non-commercial use)Mark Williams CMark Williams CompanyWindows,OtherYesProprietaryMicrosoft CMicrosoftWindowsYesProprietaryNwccNils WellerWindows,Unix,OtherNoBSDOpen64SGI Google HP Intel Nvidia PathScale Tsinghua University and othersUnix,OtherNoGPLPelles CPelle OriniusWindowsYesFreewarePGCCThe Portland GroupWindows,Unix,Other— Mac OS XYes — Visual Studio on WindowsProprietaryPortable C CompilerAnders Magnusson and othersWindows,Unix,OtherNoBSDPower CMix SoftwareOtherNoProprietaryQuickCMicrosoftWindowsYesProprietarySAS/CSAS InstituteWindows,Unix,Other-IBM mainframe, AmigaOS, 68K, 88K, UnixYesProprietaryTiny C CompilerFabrice BellardWindows,UnixNoLGPLTurbo CEmbarcaderoOtherNoProprietary - V 2.01 freely availableCCS C CompilerCCS, Inc.Windows,Unix,OtherYesProprietaryMikroC CompilerMikroElektronika, Inc.Windows,Unix,OtherYesProprietaryups debugger (includes C interpreter)Tom Hughes, Ian Edwards, and othersUnix,Other-Solaris, SunOSYesGPLVBCCDr. Volker BarthelmannWindows,Unix,OtherNoFreeware (source code available,XL CIBMUnix-AIXEclipseProprietary当然,编译器还与计算硬件平台息息相关。同一个编译器会因为计算机体系结构不同而分为不同的版本。如 arm64,armhf,x86, x86_64,PowerPC 等等。在本教程中,我们主要会使用到 gcc 编译器。同时我们会在 arm64,armhf,x84_64 等硬件平台上编译我们的程序。从中可以看出 C 语言的移植性还是很好的。同样的程序,我们可以在不同的编译器以及硬件平台上编译执行。Tips:请大家注意,我们的学习要求操作系统为 Windows 10,Linux, Unix, 或者 MacOS。对于微软已经停止维护的 Windows 7 以及更早的系统。我们没有办法使用新的特性来编译和运行相关的程序。

5. 编译安装

执行如下命令将会对 nginx 源码包进行编译安装:make && make install执行结果如下图:

3. 编译并安装

傻瓜式,使用默认安装配置,以及默认安装模块。这样 Nginx 将会安装到默认的 /usr/local/nginx 目录,可执行文件是 /usr/local/nginx/sbin/nginx,默认的配置文件是 /usr/local/nginx/conf/nginx.conf。$ cd nginx-1.17.6$ ./configure # 编译,检查依赖是否正确$ make && sudo make install # 安装如果想自定义比如安装目录、编译新的模块或者第三方模块,需要使用相应的参数。# 参数说明:--prefix=PATH: #指定安装目录--with-xxx_module: #添加某某模块, xxx为对应的模块名称,比如--with-http_ssl_module等,这是针对没有默认编译进Nginx的模块--without-xxx_module: #禁止某模块编译进 Nginx , xxx 为对应模块名称,比如--without-stream_access_module 等,这是针对默认会编译进 Nginx 的模块--add-module=PATH: #添加第三方 Nginx 模块,指定模块路径即可,非常简单# 对于查看具体支持哪些参数选项,包括所有可以加入和禁止编译进Nginx的模块,# 通过如下命令查询:$ ./configure --help# 我们为后续开展测试,多添加几个模块进Nginx,让编译出来的Nginx具备更多功能$ ./configure --prefix=/root/nginx \--with-http_ssl_module \--with-http_stub_status_module \--with-http_gzip_static_module \--with-stream \--with-http_realip_module \--with-http_flv_module \--with-http_random_index_module \--with-mail \--with-pcre \# 安装$ make && sudo make install

3.3 测试项目

点击菜单栏-运行,将项目运行到内置浏览器,看看控制台有没有报错,根据报错提示来修改其他的错误。比较常见的错误有:路径错误:根据系统提示修改成正确路径即可;mpvue自有 API 不兼容:比如 mpvue.request,需要改为 uni.request;预编译错误:一般是缺少了插件等原因,比如 mpvue 项目中使用了 scss 编译,我们需要在 HBuilderX 中安装这个插件,不然就会出现预编译错误,点击工具-插件安装,根据系统提示就可以安装插件。

Kotlin 命令行编译

我们一般编写代码都会借助 IDE 工具,因为这样可以快速提高开发效率。但是需要去理解一个 Kotlin源文件是如何编译运行的,所以这篇文章将教你如何使用command来编译运行 Kotlin 源码。

2. 下载编译包

可直接到 github 下载 ECharts 编译文件,以 4.5.0 为例,下载地址:https://github.com/apache/incubator-echarts/tree/4.5.0/dist,打开页面可看到多个编译版本:几个主要版本分别为:echarts.js:完整版,压缩后约 744KB,包含所有图表和组件;echarts.common.js:常用版,压缩后约 471KB,只包含常用的图表和组件,包括: line、bar、pie、scatter;echarts.simple.js:精简版,压缩后约 305KB,只包含最常用的图表和组件,包括: line、bar、pie。剩下的文件中,名字带 en 的是对应版本的英文版;名字带 min 的是对应版本的压缩版。下载完成后,需要在页面使用 <script src="echarts.js"></script> 标签引入代码文件。

5.4 编译和运行应用

本部分会学习如何进行编译和运行的配置。如何使用 Android Studio来编译和运行应用。另外还会介绍下平时不太常用的命令行编译方式,虽然不常用,但是也是必不可少的知识点。

1.1 编译运行

要编译和运行我们的应用,请按以下步骤操作:在工具栏中,从运行配置下拉菜单中选择我们的应用。从目标设备下拉菜单中,选择要用来运行应用的设备。4. 点击 Run 图标 。

首页上一页1234567下一页尾页
直播
查看课程详情
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号