当前位置: 首页 > Web前端 > HTML5

Emscripten教程之emcc编译命令

时间:2023-04-05 17:32:35 HTML5

emcc(EmscriptenCompilerFrontend)介绍及翻译:本文为Emscripten-WebAssembly专栏系列之一。更多文章请参考专栏。也可以去作者的博客阅读文章。欢迎加入Wasm与emscripten技术交流群,群聊号:939206522。emcc用于命令行调用Emscripten的编译器,它实际上是标准编译器gcc或clang的替代品。语法emcc[options]file...这个输入文件file可以是clang可以编译的C/C++语言,也可以是二进制形式的llvmbitcode或人类可读形式的llvm汇编文件。clang或gcc的大部分选项都可以工作,例如:#显示信息emcc--help#显示编译器版本信息emcc--version如果你想在Emscripten中查看当前clang版本支持的所有选项列表,你可以直接使用命令:clang--help.emcc下面列出了emcc中修改的或新增的选项:首先是一些编译优化标志,它们是-O0、-O1、-O2、-Os、-Oz、-O3。-O0:不编译优化(这是默认值)。建议在第一次移植项目时使用它,因为它会包含很多断言。-O1:简单优化。建议大家在想缩短编译时间和编译优化的时候使用。毕竟它的编译速度比-O2优化快得多。它将优化asm.js和llvm的-O1,它会重新循环,它会删除运行时断言和C++异常捕获,它还会使-sALIASING_FUNCTION_POINTERS=1。要再次启用C++异常捕获,请设置:-sDISABLE_EXCEPTION_CATCHING=0。-O2:类似于-O1,但有JavaScript级的优化和一些llvm-O3的优化项。当您要发布项目时,建议使用此级别的优化。-O3:与-O2类似,但比-O2有更多的JavaScript优化,编译时间明显长于-O2。这也被推荐用于发布。-Os:与-O3类似,但增加了额外的优化以减少生成代码的大小,代价是性能比-O3稍差。-Os优化影响llvm位码和JavaScript文件生成。-Oz:类似于-Os,但进一步减少了代码大小。-sOPTION=VALUE传递给编译器的与JavaScript代码生成相关的所有选项。有关选项列表,请参阅settings.js。对于一个选项的值,不仅可以直接在emcc命令行中设置,也可以写入一个json文件中。比如下面就是把DEAD_FUNCTIONS选项的值放在path/to/file文件中,把这个文件的路径传到emcc中。-sDEAD_FUNCTIONS=@/path/to/filenote:1.文件内容可以是:["_func1","_func2"];2.文件路径必须是绝对路径,不能是相对路径。-g:这个是保留调试信息标志。如果只是编译成bitcode,则与clang和gcc中的-g是一样的。如果要编译为JavaScript,-g等于-g3。-g控制打印调试信息的数量,每一层都在上一层的基础上编译:-g0:不保留调试信息。-g1:保留空格,不压缩。-g2:保留函数名。-g3:保留变量名,同-g。编译后变量名一般不用保留,但如果保留,就可以推断出变量的用途了吧?-g4:保留llvm调试信息,是最高级别可以调试的。注意:优化级别越高,编译时间越长--profiling:--profiling-funcs:--tracing:启用Emscripten的tracingAPI。--emit-symbol-map:--js-opts:允许JavaScript优化,有两个值:0:不允许JavaScript优化器;1:使用JavaScript优化器。通常我们不需要设置此项,因为在设置-O后的级别时,此项可以顺便得到一个合适的值。注意:有些选项会覆盖这个标志的值,例如EMTERPRETIFY、DEAD_FUNCTIONS、OUTLINING_LIMIT、SAFE_HEAP和SPLIT_MEMORY会设置js-opts=1,因为它们依赖于js优化器。--llvm-opts<级别>:启用llvm优化。它的值是:0:不使用llvm优化1:llvm-O1优化2:llvm-O2优化3:llvm-O3优化同--js-opts,通常我们不需要设置这个item,因为设置-O后的level时,这个item可以顺便取一个合适的值。--llvm-lto:启用llvm链接时优化。可以取值0、1、2、3。--closure:运行压缩编译器(ClosureCompiler),可能的值有,0,1,2:0:不启用压缩编译器.1:启用。2:启用。--pre-js指定在生成代码之前要添加内容的文件。--post-js代码生成后,指定要添加内容的文件。--embed-file指定一个带有路径的文件嵌入到已编译的js代码中。路径在编译时是相对于当前路径的。如果传入一个目录,则该目录下所有文件的内容都会嵌入到以后生成的js代码中。--preload-file指定在异步运行已编译代码之前要预加载的文件。路径在编译时是相对于当前路径的。如果传递目录,则目录中所有文件的内容将被预加载到.data文件中。--exclude-file从--embed-file和--preload-file之后的目录中排除一些文件,支持通配符*。--use-preload-plugins告诉文件打包器在加载文件时运行预加载插件。它用于执行任务,例如使用浏览器编解码器解码图像和音频。--shell-file指定生成HTML的模板文件。--source-map-base--minify0等于-g1。--js-transform优化前,生成代码后,设置此命令。此命令允许您修改JavaScript代码。之后,编译器将修改后的和未修改的一起编译优化。--bind启用bingdings编译源代码。Bingings是Emscripten中连接C++和JavaScript代码的一类API。--ignore-dynamic-linking告诉编译器忽略动态链接,之后用户必须手动链接到共享库。--js-library定义核心库(src/library_*)以外的js库。-v打开详细输出。这设置为将-v传递给clang并启用EMCC_DEBUG以在编译阶段生成中间文件。它还在工具链上运行Emscripten的内部完整性检查。提示:emcc-v是诊断错误的有用工具,无论您是否附加其他参数。--cache--clear-cache--clear-ports--show-ports--save-bcPATH--memory-init-file指定是否单独生成内存初始化文件。值包括0和1.0:不单独生成.mem文件。1:单独生成.mem文件。-Wwarn-absolute-paths在-I和-L命令行指令中启用有关使用绝对路径的警告。这用于警告不要无意中使用绝对路径。在引用不可移植的本机系统头文件时,使用绝对路径有时是危险的。--proxy-to-worker--emrun让生成的代码知道emrun命令行工具。这允许在运行emran生成的应用程序时捕获stdout、stderr和退出(返回代码)。--cpuprofiler在生成的页面上嵌入一个简单的CPU分析器。使用它来执行粗略的交互式分析。--memoryprofiler在生成的页面上嵌入一个内存分配跟踪器,用它来分析应用程序Emscripten堆的使用情况。--threadprofiler在生成的页面上嵌入线程活动分析器。当多线程编译正在进行时,使用它来分析多线程应用程序。--em-config--default-obj-ext.ext--valid-abspathpath设置绝对路径白名单,防止绝对路径警告。-o编译输出的文件格式。target的值可以是:name.js:JavaScript文件;name.html:HTML+js文件。JS单独生成,减少页面加载时间。name.bc:llvm位码。这是默认值。name.o:同上。注意:如果使用--memory-init-file,代码的单独部分将从js文件中分离出来,作为.mem文件。-c生成llvm位码代码而不是JavaScript。--separate-asm将asm.js文件单独生成成一个文件。这减少了启动时的内存负载。--output_eolwindows|linux指定生成的文本文件的行尾。如果是--output_eolwindows,就是windowsrn这一行的结尾。如果是–output_eollinux,则生成linux行尾的文本文件。--cflags环境变量emcc会受到几个环境变量的影响,如下:EMMAKEN_JUST_CONFIGUREEMMAKEN_JUST_CONFIGURE_RECURSEEMCONFIGURE_JSEMCONFIGURE_CCEMMAKEN_CXXEMMAKEN_COMPILEREMMAKEN_CFLAGSEMCC_DEBUG其中比较有意思的是EMCC_DEBUG。比如在编译前设置setEMCC_DEBUG=1,那么编译过程中的调试信息和编译各阶段的中间文件都会在编译时输出到一个临时目录中,也算是给开发者在编译过程中提供了一些帮助编译或换句话说调试信息。Emscripten专题系列文章是emscripten中文站的一部分。第一篇介绍代码的可移植性和局限性第二篇介绍Emscripten的运行环境第三篇第一篇介绍连接C++和JavaScript第三篇第二篇介绍embind第四篇介绍文件和文件系统第六篇介绍Emscripten如何调试代码