轉載自:gcc -l參數和-L參數
# Eg.
$ gcc test.c -o run -lglfw.3.2 -framework OpenGL
-l
參數就是用來指定程序要鏈接的庫,-l
參數緊接着就是庫名(中間沒有空格),那麼庫名跟真正的庫文件名有什麼關係呢?就拿數學庫來說,他的庫名是m,他的庫文件名是libm.so,很容易看出,把庫文件名的頭lib和尾.so去掉就是庫名了。
Mac中的第三方庫的名字是以
.dylib
結尾的如:libglfw.3.2.dylib
好了現在我們知道怎麼得到庫名,當我們自已要用到一個第三方提供的庫名字libtest.so,那麼我們只要把libtest.so拷貝到/usr/lib裏,編譯時加上-ltest參數,我們就能用上libtest.so庫了(當然要用libtest.so庫裏的函數,我們還需要與libtest.so配套的頭文件)
放在 /lib
和 /usr/lib
和 /usr/local/lib
裏的庫直接用 -l
參數就能鏈接了,但如果庫文件沒放在這三個目錄裏,而是放在其他目錄裏,這時我們只用 -l
參數的話,鏈接還是會出錯,出錯信息大概是:/usr/bin/ld: cannot find -lxxx
,也就是鏈接程序ld在那3個目錄裏找不到 libxxx.so
,這時另外一個參數 -L
就派上用場了,比如常用的X11的庫,它在 /usr/X11R6/lib
目錄下,我們編譯時就要用 -L/usr/X11R6/lib -lX11
參數, -L
參數跟着的是庫文件所在的目錄名。再比如我們把 libtest.so
放在 /aaa/bbb/ccc
目錄下,那鏈接參數就是 -L/aaa/bbb/ccc -ltest
-include和-I參數
-include
用來包含頭文件,但一般情況下包含頭文件都在源碼裏用 #include xxxxxx
實現, -include
參數很少用。 -I
參數是用來指定頭文件目錄, /usr/include
目錄一般是不用指定的,gcc知道去那裏找,但是如果頭文件不在 /usr/include
裏我們就要用 -I
參數指定了,比如頭文件放在 /myinclude
目錄裏,那編譯命令行就要加上 -I/myinclude
參數了,如果不加你會得到一個 xxxx.h: No such file or directory
的錯誤。 -I
參數可以用相對路徑,比如頭文件在當前目錄,可以用 -I.
來指定。