1. 程式人生 > >使用GCC和pkg-config編譯

使用GCC和pkg-config編譯

gcc -Wall -g Test.c -o Test `pkg-config --cflags --libs gstreamer-0.10`

GCC編譯器是Linux下標準C的編譯器

上述編譯命令傳遞了幾個編譯選項

-Wall 開啟了所有編譯警告

-g 開啟了除錯功能,因此您可以使用編譯好的程式進行除錯,無論使用GDB或您選擇的偵錯程式

pkg-config程式是幹什麼用的?簡單的說就是向用戶程式提供相應庫的路徑、版本號等資訊的程式

$ pkg-config --cflags --libs gstreamer-0.10
-pthread -I/usr/include/gstreamer-0.10 -I/usr/include/glib-2.0 -I/usr/lib/i386-linux-gnu/glib-2.0/include -I/usr/include/libxml2  -pthread -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lxml2 -lglib-2.0

gcc -Wall -g Test.c -o Test `pkg-config --cflags --libs gstreamer-0.10`與gcc  `pkg-config --cflags --libs gstreamer-0.10` -Wall -g Test.c -o Test 的區別

當我們用gcc  `pkg-config --cflags --libs gstreamer-0.10` -Wall -g Test.c -o Test進行編譯的時候gcc編譯器會報一些undefined reference的錯誤,但是用gcc -Wall -g Test.c -o Test `pkg-config --cflags --libs gstreamer-0.10`就不會

原因:對於C/C++編譯而言,讀取編譯選項是按照從左到右的順序執行的。那麼當編譯器遇到原始檔的時候,就開始對原始檔中用到的函式進行解析,找到對應的函式實現。這個過程是按照先遇到不能解析的函式,然後在原始檔後面的一些選項中尋找可能的函式體資訊。

對於gcc  `pkg-config --cflags --libs gstreamer-0.10` -Wall -g Test.c -o Test, 由於包含函式體或者函式定義資訊的編譯選項出現在原始檔之前,那麼當編譯器在原始檔中遇到不能解析的函式時,在原始檔之後的選項中尋找相關的資訊,那麼就出現了編譯錯誤,也就是無法找到相關的函式定義