makefile中一些编译器选项

Posted wangzhiyi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了makefile中一些编译器选项相关的知识,希望对你有一定的参考价值。

makefile中一些编译器选项

CFLAGS CXXFLAGS

  • CFLAGS 表示用于 C 编译器的选项
  • CXXFLAGS 表示用于 C++ 编译器的选项
  • 这两个变量实际上涵盖了__编译__和__汇编__两个步骤
  • 指定头文件(.h文件)的路径
    • CFLAGS=-I/usr/include -I/path/include

(安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入到该变量中来)

LDFLAGS

  • gcc等编译器会用到的一些优化参数
  • __指定__库文件的位置(静态库文件,连接阶段使用)
  • LDFLAGS=-L/usr/lib -L/path/to/your/lib

(每安装一个包都几乎一定的会在安装目录里建立一个lib目录。如果明明安装了某个包,而安装另一个包时出现找不到已经安装的包时,可以把那个包的lib路径加入的LDFALGS中试一下)

LIBS

  • 告诉链接器要链接哪些库文件
  • LIBS = -lpthread -liconv

(简单地说,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

如果在执行./configure以前设置环境变量export LDFLAGS="-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib" ,注意__设置环境变量等号两边不可以有空格__,而且要加上__引号__(shell的用法)。
那么执行configure以后,Makefile将会设置这个选项,链接时会有这个参数,编译出来的可执行程序的库文件搜索路径就得到扩展了。


LD_LIBRARY_PATH环境变量

  • __指定__的共享库/动态库搜索路径(运行阶段使用)
  • echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64/:/usr/local/lib/:/usr/lib64/:/usr/lib/:/lib/:/lib64/ :/usr/local/cuda-8.0/lib64/" >> /home/worker/.bashrc
  • 配置文件/etc/ld.so.conf 与 ldconf
    • 待补充

头文件、库文件的搜索顺序

待更新

头文件

静态库

动态库

参考Linux系统 GCC搜索头文件和库文件的执行顺序

参考资料


以上是关于makefile中一些编译器选项的主要内容,如果未能解决你的问题,请参考以下文章

是否可以从 gcc 的源代码中确定或设置编译器选项?

makefile怎么写?

Makefile选项CFLAGS,LDFLAGS,LIBS

GCC 警告

使用带有 NMake 样式 Makefile 的 clang-cl 无法回显

Makefile选项CFLAGS,LDFLAGS,LIBS