導航:首頁 > 源碼編譯 > gcc靜態編譯

gcc靜態編譯

發布時間:2022-01-29 23:06:20

① 在linux下,如何強制讓GCC靜態鏈接

② 在Linux下如何使用GCC編譯程序、簡單生成 靜態庫及動態庫

一個程序調用了一個動態庫,但是兩者之間有函數重名,導致運行時動態庫中的Linux下動態庫文件的擴展名為這樣,線程函數庫被稱作libthread.so。靜態庫的

③ linux命令gcc–static式什麼意思

gcc
空格
-static
吧?
-static
是讓
gcc
進行靜態編譯,也就是把所有都需要的函數庫都集成進編譯出來的程序上,這個程序就可以不依賴外部的函數庫運行了。

④ LInux 如何使用GCC編譯器將一個文件夾下的100個.o文件打包成一個靜態庫文件(.a)

你已經用gcc編譯出目標文件了,用ar工具打包成.a文件就行了啊,示例:


如上圖,假設我有test1.c,test2.c兩個源文件,先使用gcc -c *.c將源文件編譯成目標文件,可以看到,生成了test1.o,test2.o兩個目標文件,然後,使用ar命令:ar crv libtest.a *.o將該目錄下的所有目標文件打包生成了libtest.a文件。這樣,你在編譯的時候就可以直接使用這個靜態庫了。

⑤ GCC中靜態連接和動態連接的區別

1:靜態連接的時候,靜態庫的所有執行代碼被直接編譯到目標程序中。而動態連接的時候,僅僅把動態庫的函數和變數的符號名,地址偏移量等導入到目標程序。只有在目標程序運行的時候才把動態庫的執行代碼載入到內存中。
2:動態鏈接的項目容易管理,把不同模塊封裝成不同的動態庫,如果模塊功能修改,一般只需要重新生成該動態庫,不用重新編譯其他模塊和目標程序。而靜態鏈接的程序修改任何一個地方都必須重新編譯整個程序
3:靜態鏈接生成的目標程序體積比動態鏈接的大,但是載入速度更快,發布更容易,不需要檢查發布機器上是否有該動態庫或者動態庫版本是否符合要求。
4:如果多個程序使用一個動態庫,則該庫的執行代碼只會在內存中載入一次。而靜態庫是多次載入(事實上靜態庫連接完就沒用了,等於目標程序的一部分)。
5:從調試的角度來說,靜態連接的程序調試方法和獨立程序沒有任何區別,而動態庫的調試相對要復雜一些,因為庫裡面的符號地址都是相對地址。

⑥ 如何使用GCC生成動態庫和靜態庫

下面以工程libtest為例說明gcc創建和使用靜態庫、動態庫的過程,libtest目錄結構和內容如圖1所示,其中三個文件hello.h,hello.c和main.c的內容如下。

libtest/include/hello.h

#ifdef _HELLO_H_
#define _HELLO_H_
void hello();
#endif
libtest/lib/hello.c
#include "hello.h"
#include <stdio.h>
void hello()
{
printf("hello world!\n");
}
libtest/src/main.c
#include "hello.h"
int main()
{
hello();
}

靜態庫過程如下:
(1) 進入libtest/lib目錄,執行命令:
gcc -c -I../include hello.c
該命令生成目標文件hello.o,注意:參數-I添加頭文件搜索目錄,這里因為hello.c中有#include 「hello.h」,hello.h在libtest/include目錄中,這里需要指定該目錄通知gcc,否則出現錯誤提示「找不到頭文件hello.h」。
這一步將在libtest/lib目錄中生成一個hello.o文件。
(2) 在libtest/lib目錄,執行命令:
ar rc libhello.ahello.o
該命令將hello.o添加到靜態庫文件libhello.a,ar命令就是用來創建、修改庫的,也可以從庫中提出單個模塊,參數r表示在庫中插入或者替換模塊,c表示創建一個庫
這一步將在libtest/lib目錄中生成一個libhello.a文件。
(3) 進入libtest/src目錄,執行命令:
gcc main.c-I../include -L../lib -lhello -o main
該命令將編譯main.c並鏈接靜態庫文件libhello.a生成可執行文件main,注意:參數-L添加庫文件搜索目錄,因為libhello.a在libtest/lib目錄中,這里需要指定該目錄通知gcc,參數-l指定鏈接的庫文件名稱,名稱不用寫全名libhello.a,只用寫hello即可。
這一步將在libtest/src目錄中生成可執行文件main。

動態庫過程如下:
(1) 進入libtest/lib目錄,執行命令:
gcc hello.c-I../include -fPIC -shared -o libhello.so
這一步將在當前目錄生成動態庫文件libhello.so,參數-fPIC -shared固定格式,不用糾結他們什麼意思。
(2) 進入libtest/src目錄,執行命令:
gcc main.c-I../include -L../lib -lhello -o main
此時在當前目錄中已經生成了可執行文件main,執行./main時卻提示錯誤:
./main: error while loading shared libraries: libhello.so: cannotopen shared object file: No such file or directory
也就是找不到動態庫文件libhello.so,在網上找了答案說如果遇到這樣的問題需要設置環境變數LD_LIBRARY_PATH,如下:
export LD_LIBRARY_PATH=」../lib」
gcc main.c -I../include -L../lib -lhello -o main
然後再執行./main就沒有錯誤了。
【補充】
環境變數LD_LIBRARY_PATH指示動態連接器可以裝載動態庫的路徑,在鏈接動態庫文件前設置該變數為庫文件所在路徑,注意:用export LD_LIBRARY_PATH=」…」方式只是臨時生效的,如果要永久有效可以寫入~/.bashrc文件中,跟修改PATH類似,exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:」…」。
當然如果有root許可權的話,也可以修改/etc/ld.so.conf文件,將要添加的動態庫搜索路徑寫入該文件中,然後調用/sbin/ldconfig來達到同樣的目的。

⑦ 簡述gcc編譯時使用靜態庫和動態庫的區別

函數庫分為靜態庫和動態庫兩
種。靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。動態
庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運
行時還需要動態庫存在。

⑧ GCC怎樣進行靜態編譯

-static 前提是GTK提供了靜態庫否則沒戲
a有可能是導出庫,先編譯 再檢查依賴 用Dependency Walker 缺啥 打包啥

⑨ 如何使用gcc在EditPlus編輯器下對GTK程序進行靜態編譯

GTK的安裝

sudo apt-get install vim #使用vim來編寫代碼,當然您可以使用任何自己喜歡的編輯器

sudo apt-get install build-essential #這將安裝gcc/g++/gdb/make 等基本編程工具

sudo apt-get install gnome-core-devel #這將安裝 libgtk2.0-dev libglib2.0-dev 等開發相關的庫文件

sudo apt-get install pkg-config #用於在編譯GTK程序時自動找出頭文件及庫文件位置

sudo apt-get install devhelp #這將安裝 devhelp GTK文檔查看程序

sudo apt-get install libglib2.0-doc libgtk2.0-doc #這將安裝 gtk/glib 的API參考手冊及其它幫助文檔

sudo apt-get instal glade libglade2-dev #這將安裝基於GTK的界面GTK是開發Gnome窗口的c/c++語言圖形庫。在Ubuntu的機器上折騰了一下,復制了網上教程的代碼在本機上編譯。代碼的文件名:t1.c。按照教程,用以下命令編譯:

gcc t1.c 'pkg-config --cflags --libs gtk+-2.0`

編譯結果:找不到gtk/gtk.h。

因為我的Ubuntu是Gnome系統,所以我以為gtk+2.0的開發程序(頭文件和庫文件)應該已經安裝在計算機上了。其實不然,如果在Ubuntu 上開發gtk+2.0的程序,需要安裝相應的頭文件和庫。在控制台窗口輸入sudo apt-get install libgtk2.0*, gtk+2.0所需的所有文件統通下載安裝完畢。再次應用編譯命令:gcc t1.c 'pkg-config --cflags --libs gtk+-2.0,編譯通過,運行。

pkg-config是一個用來管理包的程序,在控制台輸入 pkg-config --cflags --libs gtk+-2.0 的運行結果:

-DPNG_NO_MMX_CODE -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng12 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lfontconfig -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXcomposite -lXdamage -lpango-1.0 -lcairo -lX11 -lXfixes -lgobject-2.0 -lgmole-2.0 -ldl -lglib-2.0

可以看出,輸出的文本包括了gcc編譯gtk+2.0所需要的所有選項(頭文件目錄和庫文件)。

這里有一點需要注意, gcc t1.c `pkg-config --cflags --libs gtk+-2.0`, pkg-config --cflags --libs gtk+-2.0兩側的引號並不是真正的引號,而是鍵盤數字件那一行,最左邊的那個字元。如果錯用了單引號,gcc無法使用 pkg-config --cflags --libs gtk+-2.0產生的文本作為編譯選項。構造程序。
$ gcc gtkhello.c -o gtktest `pkg-config --cflags --libs gtk+-2.0`
$ ./gtktest
gcc gtk1.c `pkg-config --cflags --libs gtk+-2.0`

//////////////////////////////////////////////////////////////////////////////////////////////////////

首先獲得超級用戶許可權

apt-get install vim #使用vim來編寫代碼,當然您可以使用任何自己喜歡的編輯器
apt-get install build-essential #這將安裝gcc/g++/gdb/make 等基本編程工具
apt-get install gnome-core-devel #這將安裝 libgtk2.0-dev libglib2.0-dev 等開發相關的庫文件
apt-get install pkg-config #用於在編譯GTK程序時自動找出頭文件及庫文件位置
apt-get install devhelp #這將安裝 devhelp GTK文檔查看程序
apt-get install libglib2.0-doc libgtk2.0-doc #這將安裝 gtk/glib 的API參考手冊及其它幫助文檔
apt-get instal glade libglade2-dev #這將安裝基於GTK的界面構造程序

都是安裝好後測試一下程序hello.c

#include <gtk/gtk.h> ----------我編譯時老是說找不到頭文件,後來在/usr/include里找到gtk-2.0/gtk/gtk.h,原來是路徑錯誤,最後將頭文件路徑修改為<gtk-2.0/gtk/gtk.h>,終於好了!

void hello(GtkWidget *widget,gpointer data)
{
g_print("Hello 大家好\n");
}
gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)
{
g_print ("delete event occurred\n");
return(TRUE);
}
void destroy(GtkWidget *widget,gpointer data)
{
gtk_main_quit();
}
int main( int argc, char *argv[] )
{
GtkWidget *window;
GtkWidget *button;
gtk_init (&argc, &argv);
window=gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(delete_event),NULL);
gtk_signal_connect (GTK_OBJECT (window), "destroy",GTK_SIGNAL_FUNC (destroy), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
button = gtk_button_new_with_label ("Hello 大家好");
gtk_signal_connect (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (hello), NULL);
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC(gtk_widget_destroy),GTK_OBJECT (window));
gtk_container_add (GTK_CONTAINER (window), button);
gtk_widget_show (button);
gtk_widget_show (window); /*顯示一個窗口*/
gtk_main(); /*進入主循環*/
return(0);
}

最後編譯運行:

$ gcc hello.c -o hello `pkg-config --cflags --libs gtk+-2.0`
$ . /hello

////////////////////////////////////////////////////////////////////

GTK的安裝

sudo apt-get install vim #使用vim來編寫代碼,當然您可以使用任何自己喜歡的編輯器

sudo apt-get install build-essential #這將安裝gcc/g++/gdb/make 等基本編程工具

sudo apt-get install gnome-core-devel #這將安裝 libgtk2.0-dev libglib2.0-dev 等開發相關的庫文件

sudo apt-get install pkg-config #用於在編譯GTK程序時自動找出頭文件及庫文件位置

sudo apt-get install devhelp #這將安裝 devhelp GTK文檔查看程序

sudo apt-get install libglib2.0-doc libgtk2.0-doc #這將安裝 gtk/glib 的API參考手冊及其它幫助文檔

sudo apt-get instal glade libglade2-dev #這將安裝基於GTK的界面GTK是開發Gnome窗口的c/c++語言圖形庫。在Ubuntu的機器上折騰了一下,復制了網上教程的代碼在本機上編譯。代碼的文件名:t1.c。按照教程,用以下命令編譯:

gcc t1.c 'pkg-config --cflags --libs gtk+-2.0`

編譯結果:找不到gtk/gtk.h。

因為我的Ubuntu是Gnome系統,所以我以為gtk+2.0的開發程序(頭文件和庫文件)應該已經安裝在計算機上了。其實不然,如果在Ubuntu 上開發gtk+2.0的程序,需要安裝相應的頭文件和庫。在控制台窗口輸入sudo apt-get install libgtk2.0*, gtk+2.0所需的所有文件統通下載安裝完畢。再次應用編譯命令:gcc t1.c 'pkg-config --cflags --libs gtk+-2.0,編譯通過,運行。

pkg-config是一個用來管理包的程序,在控制台輸入 pkg-config --cflags --libs gtk+-2.0 的運行結果:

-DPNG_NO_MMX_CODE -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng12 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lfontconfig -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXcomposite -lXdamage -lpango-1.0 -lcairo -lX11 -lXfixes -lgobject-2.0 -lgmole-2.0 -ldl -lglib-2.0

可以看出,輸出的文本包括了gcc編譯gtk+2.0所需要的所有選項(頭文件目錄和庫文件)。

這里有一點需要注意, gcc t1.c `pkg-config --cflags --libs gtk+-2.0`, pkg-config --cflags --libs gtk+-2.0兩側的引號並不是真正的引號,而是鍵盤數字件那一行,最左邊的那個字元。如果錯用了單引號,gcc無法使用 pkg-config --cflags --libs gtk+-2.0產生的文本作為編譯選項。構造程序。

$ gcc gtkhello.c -o gtktest `pkg-config --cflags --libs gtk+-2.0`
$ ./gtktest

gcc gtk1.c `pkg-config --cflags --libs gtk+-2.0`

⑩ arm-linux-gcc交叉編譯是靜態編譯還是動態的

你得看這個編譯器的configure是啥

如果沒有特殊參數,默認都是動態編譯

沒有依賴的動態庫當然不能運行

閱讀全文

與gcc靜態編譯相關的資料

熱點內容
大爺程序員 瀏覽:197
自私的基因pdf 瀏覽:470
程序員是怎麼做優化設置 瀏覽:250
命令與征服現代沖突視頻 瀏覽:677
基於單片機的文獻綜述 瀏覽:998
dnf掃貨腳本源碼 瀏覽:728
用於編譯器中緩解控制沖突的方法 瀏覽:193
rt3070aplinux 瀏覽:650
變頻空調壓縮機用電容可以啟動嗎 瀏覽:319
愛迪爾門鎖怎麼看伺服器地址 瀏覽:818
江淮車智聯伺服器內容錯誤什麼 瀏覽:133
zip解壓軟體叫什麼 瀏覽:893
java域名綁定 瀏覽:902
dns伺服器很差什麼意思 瀏覽:123
西門子數控機床編程與操作 瀏覽:993
工頻壓縮機專修 瀏覽:383
什麼app可以連接電視 瀏覽:173
神舟電腦無法復制文件夾 瀏覽:57
s7相片怎麼加密 瀏覽:530
單片機串接cd4094 瀏覽:820