以下讨论基于GCC,先附上GCC总体选项列表。

Makefile中的CFLAGS、CXXFLAGS、LDFLAGS、LIBS

CFLAGS 指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。同样地,安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入到该变量中来。 

CXXFLAGS表达上与CFLAGS相同。

CFLAGS与CXXFLAGS的区别:

CFLAGS与CXXFLAGS作为环境变量指示GCC(即GNU编译器集合)编译源代码过程中使用哪些选项,CFLAGS用于C代码,CXXFLAGS用于C++代码。举例说明:对文件 foo.c 执行以下make:
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

相关文章:

  • 2022-12-23
  • 2021-12-12
  • 2021-04-20
  • 2022-12-23
  • 2021-12-13
  • 2022-12-23
  • 2021-11-23
猜你喜欢
  • 2021-12-13
  • 2021-12-12
  • 2021-11-03
相关资源
相似解决方案