gcc&g++命令中的-l和-L

在最近的项目中使用了gcc的编译命令,有些命令的用法也不太熟,做个总结。

1
2
3
举个例子

g++ tdm_op.cc -I./tdm -L. -ldist_tree -lselector -I/usr/protobuf/include/ -L/usr/protobuf/lib/ -lprotobuf -std=c++11 -o tdmop -ldl -lpthread

-I(大写i)

  • 用来指定头文件目录
  • /usr/include目录一般不用指定,gcc知道去哪里找,但是如果头文件不在/usr/include,我们就要用 -I 来指定了,比如头文件在/myinclude,那需要加上 -l /myinclude
  • 不然会报xxxx.h:No such file or directory错误
  • 如果头文件就在当前目录,则可以使用 -I. 来指定

-l(小写l)

  • 用来指定程序要链接的库
  • 紧接着就是库名(中间没有空格),如果库名是m,则库文件名为libm.so,那么直接使用-lm
  • mac中的第三方库名是用dylib来结尾的

-L

  • 放在/lib /usr/lib /usr/local/lib 直接使用-l参数就能链接
  • 如果没有放在上述三个目录里,直接用 -l 链接会报错 ld: cannot find -lxxxx
  • 意思就是程序在那3个目录里找不到libxxx.so
  • -L跟着库文件所在的目录名
  • 比如libtest.so放在/aaa/bbb目录下,则 -L/aaa/bbb -ltest

参考链接

gcc&g++命令中参数-l和-L