簡體   English   中英

gcc編譯和鏈接

[英]gcc compiling and linking

我以這種方式創建了一個共享庫

gcc -I/home/lib 'pkg-config --cflags gtk+-2.0 libxml-2.0' -shared -fPIC -Wl,--export-dynamic file1.c file2.c -o lib.so

它可以工作,創建的庫也可以滿足我的需要。 我想知道的是此命令字符串中的編譯和鏈接在哪里,因此請向我解釋一下,並告訴我將它們分為兩個不同命令的方法,以更好地理解。 我需要理解這一點,因為我無法解釋該庫為何起作用,即使該庫必須鏈接到我從未鏈接過的另一個庫也是如此。

gcc -c選項僅用於編譯。 但是,我不確定這是否是您想要的。

您的命令在一次調用中進行編譯和鏈接。

您可以將命令分為編譯和鏈接命令:

gcc -c -o file1.o -Wall -Wextra -Werror -I/home/lib $(pkg-config --cflags gtk+-2.0 libxml-2.0) -fPIC file1.c
gcc -c -o file2.o -Wall -Wextra -Werror -I/home/lib $(pkg-config --cflags gtk+-2.0 libxml-2.0) -fPIC file2.c
gcc -shared -o lib.so file1.o file2.o

GCC使用文件名中的擴展名來確定它們是什么類型以及如何使用它們。 因此,您列出了一些以“ .c”結尾的名稱的事實告訴GCC將其編譯為C代碼。 如果僅給出以“ .o”結尾的名稱,則GCC會將其視為目標文件,而不會編譯它們。

編譯后,默認情況下,GCC鏈接以生成可執行文件。 “共享”開關告訴它創建一個共享庫。

要僅進行編譯而不進行鏈接,可以使用開關“ -c”並刪除“共享”開關,還可以刪除任何僅用於鏈接的命令參數或開關(“ -Wl,-export-動態”是其中之一,我不知道pkg-config是否會產生任何鏈接選項)。 還要刪除或更改“ -o lib.so”,因為這將設置要用於輸出文件的名稱,而這並不是僅通過編譯生成的目標文件所需要的名稱。

要僅鏈接而不進行編譯,您只需列出目標文件而不是源文件,並刪除影響編譯的開關(“ -I / home / lib”,“-fPIC”以及pkg-config產生的任何開關)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM