Friday, May 20, 2011

[Linux/Mac]编译相关的工具和命令

GNU make的常用变量

  • CFLAGS: C compiler的flags,会被传递给关于C代码的compile和link的命令
  • CXXFLAGS: C++ compiler的flags,会被传递给关于C++的compile和link的命令
  • CPPFLAGS: C PreProcessor的flags(注意,不要和CXXFLAGS混淆)。它会被传递给编译C以及C++代码的命令
  • LDFLAGS: linking阶段的选项。常用来指定一些库文件的位置 比如"-L/usr/local/Cellar/gettext/0.18.1.1/lib"
  • CC: C Compiler。比如"gcc", "cc"
  • CXX: C++ Compiler。比如"g++"
参考:
http://stackoverflow.com/questions/495598/difference-between-cppflags-and-cxxflags-in-gnu-make

autoconf

根据configure.ac生成configure文件
$ autoconf configure.ac > configure
$ chmod +x configure
$ ./configure
参见A brief introduction to autoreconf
http://sourceware.org/autobook/autobook/autobook_toc.html#SEC_Contents

autoreconf

根据configure.ac, 会调用autoconf, autoheader, aclocal, automake, libtoolize, 以及autopoint等工具生成configure文件. 然后configure再根据Makefile.am生成Makefile
$ autoreconf -is
$ ./configure
$ make
参见Using autoreconf to Update configure Scripts

configure

增加额外的编译参数(比如默认的configure找不到某个包,就需要显式的告诉它路径)
Bash底下
$ LDFLAGS="-L/opt/local/lib" CXXFLAGS="-I/opt/local/include"\
 PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/" ./configure
或者csh底下
$ env LDFLAGS="-L/opt/local/lib" CXXFLAGS="-I/opt/local/include"\
 PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/" ./configure
configure的常用参数包括
  • --prefix: 通常默认为 "--prefix=/usr/local"
  • --enable-shared: build shared libraries,否定为"--enable-shared=no"或者"--disable-shared"
  • --enable-static: build static libraries,否定为"--enable-static=no"或者"--disable-static"

ldd

显示一个可执行文件或者一个shared library文件(.so文件)所dependent的其他.so文件
$ ldd a.out 
 linux-vdso.so.1 =>  (0x00007fff4c5ff000)
 libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f55df989000)
 libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f55df5ea000)
 /lib64/ld-linux-x86-64.so.2 (0x00007f55dfc3b000)

nm

查看一个obj文件的symbol table
$ nm mypair.o
000001c4 s EH_frame1
000001a5 s __GLOBAL__I_mypair.cc
00000254 s __GLOBAL__I_mypair.cc.eh
00000153 s __Z41__static_initialization_and_destruction_0ii
0000022c s __Z41__static_initialization_and_destruction_0ii.eh
         U __ZNKSs4sizeEv
         U __ZNKSsixEm
         U __ZNSt8ios_base4InitC1Ev
         U __ZNSt8ios_base4InitD1Ev
0000012c S __ZSt3minImERKT_S2_S2_
000001e0 S __ZSt3minImERKT_S2_S2_.eh
00000000 t __ZStL17__verify_groupingPKcmRKSs
00000204 s __ZStL17__verify_groupingPKcmRKSs.eh
000002a8 b __ZStL8__ioinit
         U ___cxa_atexit
         U ___dso_handle
         U ___gxx_personality_v0
00000104 t ___tcf_0
00000278 s ___tcf_0.eh

strip

减小一个可执行文件的size。代码体积变小后可能会对icache有帮助。代价是symbol table等帮助debug的信息会被移除。
$ strip a.out

pkg-config

pkg-config相当于一个数据库,用以维护系统中那些已经安装了的library。
比如你可以通过--modversion来查询某个library的版本
$ pkg-config --modversion openssl
0.9.8j
也可以用--cflags以及--libs查询在Makefile里使用一个library所需要使用的include的路径和其他选项。比如:
$ pkg-config --cflags thrift
-I/usr/local/include/thrift  
$ pkg-config --libs thrift  
-L/usr/local/lib -lthrift
pkg-config中的library数据库是通过搜索特定路径下的一系列xxx.pc文件来建立的。每个.pc文件对应一个library,包括了这个library的一些metadata。可以通过如下命令来查看当前数据库中包含了哪些library了。
$ pkg-config --list-all

No comments: