- 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/" ./configureconfigure的常用参数包括
- --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 -lthriftpkg-config中的library数据库是通过搜索特定路径下的一系列xxx.pc文件来建立的。每个.pc文件对应一个library,包括了这个library的一些metadata。可以通过如下命令来查看当前数据库中包含了哪些library了。
$ pkg-config --list-all
No comments:
Post a Comment