本地编译:当前平台上编译用于当前平台的程序或库。
交叉编译:用特定的交叉编译器编译用于其他平台的程序或库。
一般的交叉编译工具链有:
- 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
:动态链接,编译器默认。