0%

编译基础概念

本地编译:当前平台上编译用于当前平台的程序或库。

交叉编译:用特定的交叉编译器编译用于其他平台的程序或库。

一般的交叉编译工具链有:

  • 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:指定链接时所带的参数

一般使用步骤:

  1. 调用./configure ...命令配置make相关参数。
  2. 调用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
2
pkg-config --cflags --libs x264
-DX264_API_IMPORTS -I/usr/local/Cellar/x264/r3049/include -L/usr/local/Cellar/x264/r3049/lib -lx264
  • -O0-O1-O2-O3:编译器的优化级别,-O0 表示没有优化, -O1 为默认值,-O3 优化级别最高。
  • -static:编译器将采用静态链接。
  • -shared:动态链接,编译器默认。

欢迎关注我的其它发布渠道