本地编译:当前平台上编译用于当前平台的程序或库。
交叉编译:用特定的交叉编译器编译用于其他平台的程序或库。
一般的交叉编译工具链有:
- CC:C语言编译器
- CXX:C++编译器
- AS:汇编语言编译器
- AR:打包器,将.o文件打包(CC/CXX/AS编译器生成的为.o文件)
- LD:连接器,将库文件和.o文件连接成可执行程序(如.out文件)
- NM:查看静态库文件中的符号表
- GDB:调试工具
- STRIP:通过优化减小可执行文件或者库文件体积
- Objdump:查看静态库或者动态库的方法签名
make
make工具用于简化编译命令,生成想要的库或程序。
make由configure文件(可执行)来配置,常用参数:
prefix:指定编译生成的库、可执行文件的路径host:指定运行平台cc:指定编译器cflags:指定编译时所带的参数ldflags:指定链接时所带的参数
一般使用步骤:
- 调用
./configure ...命令配置make相关参数。 - 调用
make...或者make install命令进行编译、链接,并生成可执行程序或库文件。
clang选项
控制错误和警告信息选项
-Werror:将警告转换成错误。-Wno-error=foo:保持警告“foo”不被转换成错误,即使-Werror被指定。-Wfoo:使能警告“foo”。-w:禁用所有警告。-Weverything:使能所有警告。-pedantic:警告语言扩展。-pedantic-errors:把语言扩展视作错误。-Wsystem-headers:使能来自系统头文件的警告。-ferror-limit=123:在诊断出123个错误之后停止诊断。默认是20,错误限制可以通过-ferror-limit=0来禁用。-ftemplate-backtrace-limit=123:最多实例化123个模板在模板实例化回溯对于单个警告或错误。限制的默认是10,也可以通过-ftemplate-backtrace-limit=0来禁用。
控制调试信息
clang的调试信息生成可设置以下选项,如果有多个标志,则只使用最后一个:
-g0:不生成任何调试信息(默认)。-gline-tables-only:只生成行号表。-g:生成完整的调试信息。
编译相关
-D<macro>=<value>、--define-macro <arg>、--define-macro=<arg>:添加宏定义。将<macro>定义为<value>(如果<value>省略则为 1)。-U<macro>、--undefine-macro <arg>、--undefine-macro=<arg>:取消定义宏<macro>,相当于#undef macro。-llib:指定编译的源文件中所引用的外部库名称,-l和lib之间可加空格也可不加,该选项在编译阶段可加可不加,连接阶段才有效。-Ldir:指定编译的源文件中所引用的外部库的搜索路径,-L和lib之间可加空格也可不加,该选项在编译阶段可加可不加,连接阶段才有效。连接器默认会在当前目录,系统目录搜索库,优先使用动态库,如果指定了此选项,那么将优先在dir目录下搜索库,未找到则按默认规则搜索。
备注:如果最终可执行程序是动态链接生成的,那么程序加载时默认到系统目录(一般是/usr/local/lib下)下搜索所引用的动态库(并非会到上面的dir中搜索),如果设置了LD_LIBRAY_PATH环境变量的值,那么程序加载时动态库将优先去该路径搜索,然后按默认规则搜索。
示例:
1 | pkg-config --cflags --libs x264 |
-O0、-O1、-O2、-O3:编译器的优化级别,-O0表示没有优化,-O1为默认值,-O3优化级别最高。-static:编译器将采用静态链接。-shared:动态链接,编译器默认。