以下讨论基于GCC,先附上GCC总体选项列表。
CFLAGS: 指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。同样地,安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入到该变量中来。
CXXFLAGS表达上与CFLAGS相同。
CFLAGS与CXXFLAGS的区别:
make foo.o CPPFLAGS="-I/usr/include" make foo.o CFLAGS="-I/usr/include"
对编译器的调用完全相同:
gcc -I/usr/include -c -o foo.o foo.c
但如果文件为 bar.cpp ,执行以下make:
make bar.o CPPFLAGS="-I/usr/include" make bar.o CFLAGS="-I/usr/include"
差别就出来了:
g++ -I/usr/include -c -o bar.o bar.cpp g++ -c -o bar.o bar.cpp
所以对C文件 CFLAGS 和 CPPFLAGS 效果相同,对C++文件就只识别 CPPFLAGS 。
LDFLAGS:用于指定库文件的位置。用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib。每安装一个包都几乎一定的会在安装目录里建立一个lib目录。如果明明安装了某个包,而安装另一个包时,它愣是说找不到,可以抒那个包的lib路径加入的LDFALGS中试一下。
LIBS:告诉链接器要链接哪些库文件,如LIBS = -lpthread -liconv
LDFLAGS与LIBS的区别:
LDFLAGS、LIBS都与库文件链接相关。 简单地说,LDFLAGS是告诉链接器从哪里寻找库文件,而LIBS是告诉链接器要链接哪些库文件。不过使用时链接阶段这两个参数都会加上,所以你即使将这两个的值互换,也没有问题。
有时候LDFLAGS指定-L虽然能让链接器找到库进行链接,但是运行时链接器却找不到这个库,如果要让软件运行时库文件的路径也得到扩展,那么我们需要增加这两个库给"-Wl,R":
LDFLAGS =-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib
参考:
https://stackoverflow.com/questions/2754966/cflags-vs-cppflags
http://blog.chinaunix.net/uid-20672257-id-3408132.html