gcc編譯成庫
㈠ 在Linux下如何使用GCC編譯程序、簡單生成 靜態庫及動態庫
一個程序調用了一個動態庫,但是兩者之間有函數重名,導致運行時動態庫中的Linux下動態庫文件的擴展名為這樣,線程函數庫被稱作libthread.so。靜態庫的
㈡ 如何使用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來達到同樣的目的。
㈢ 如何將C/C++程序編譯到指定的大小如編譯成100KB大小
來設置
用於控制台窗口操作的API函數如下:
GetConsoleScreenBufferInfo 獲取控制台窗口信息
GetConsoleTitle 獲取控制台窗口標題
ScrollConsoleScreenBuffer 在緩沖區中移動數據塊
SetConsoleScreenBufferSize 更改指定緩沖區大小
SetConsoleTitle 設置控制台窗口標題
SetConsoleWindowInfo 設置控制台窗口信息
此外,還有窗口字體、顯示模式等控制函數,這里不再細說。下列舉一個示例,程序如下:
#include
#include
#include
void main()
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
// 獲取標准輸出設備句柄
CONSOLE_SCREEN_BUFFER_INFO bInfo; // 窗口緩沖區信息
GetConsoleScreenBufferInfo(hOut, bInfo );
// 獲取窗口緩沖區信息
char strTitle[255];
GetConsoleTitle(strTitle, 255); // 獲取窗口標題
printf("當前窗口標題是:%s\n", strTitle);
_getch();
SetConsoleTitle("控制台窗口操作"); // 獲取窗口標題
_getch();
COORD size = ;
SetConsoleScreenBufferSize(hOut,size); // 重新設置緩沖區大小
_getch();
SMALL_RECT rc = ; // 重置窗口位置和大小
SetConsoleWindowInfo(hOut,true ,&rc);
CloseHandle(hOut); // 關閉標准輸出設備句柄
}
㈣ Linux上怎麼用GCC編譯動態庫
以創建文件hello.c,內容如下:
#include
voidhello(void)
{
printf("HelloWorld ");
}
用命令
gcc-sharedhello.c-olibhello.so
編譯為動態庫。可以看到,當前目錄下多了一個文件libhello.so。
㈤ 如何用gcc編譯動態庫
今天要用到靜態庫和動態庫,於是寫了幾個例子來鞏固一下基礎。
hello1.c ————————————————————
#include <stdio.h>
void print1(int i) { int j; for(j=0;j<i;j++) { printf("%d * %d = %d\n",j,j,j*j); } }
hello2.c _________________________________________________
#include <stdio.h>
void print2(char *arr) { char c; int i=0; while((c=arr[i++])!='\0') { printf("%d****%c\n",i,c); } }
hello.c ____________________________________________________
void print1(int); void print2(char *);
int main(int argc,char **argv) { int i=100; char *arr="THIS IS LAYMU'S HOME!"; print1(i); print2(arr);
return 0; }
可以看到hello.c要用到hello1.c中的print1函數和hello2.c中的print2函數。所以可以把這兩個函數組合為庫,以供更多的程序作為組件來調用。
方法一:將hello1.c和hello2.c編譯成靜態鏈接庫.a
[root@localhost main5]#gcc -c hello1.c hello2.c
//將hello1.c和hello2.c分別編譯為hello1.o和hello2.o,其中-c選項意為只編譯不鏈接。
[root@localhost main5]#ar -r libhello.a hello1.o hello2.o
//將hello1.o和hello2.o組合為libhello.a這個靜態鏈接庫
[root@localhost main5]#cp libhello.a /usr/lib
//將libhello.a拷貝到/usr/lib目錄下,作為一個系統共享的靜態鏈接庫
[root@localhost main5]#gcc -o hello hello.c -lhello
//將hello.c編譯為可執行程序hello,這個過程用到了-lhello選項,這個選項告訴gcc編譯器到/usr/lib目錄下去找libhello.a的靜態鏈接庫
以上的過程類似於windows下的lib靜態鏈接庫的編譯及調用過程。
方法二:將hello1.o和hello2.o組合成動態鏈接庫.so
[root@localhost main5]#gcc -c -fpic hello1.c hello2.c
//將hello1.c和hello2.c編譯成hello1.o和hello2.o,-c意為只編譯不鏈接,-fpic意為位置獨立代碼,指示編譯程序生成的代碼要適合共享庫的內容這樣的代碼能夠根據載入內存的位置計算內部地址。
[root@localhost main5]#gcc -shared hello1.o hello2.o -o hello.so
//將hello1.o和hello2.o組合為shared object,即動態鏈接庫
[root@localhost main5]#cp hello.so /usr/lib
//將hello.so拷貝到/usr/lib目錄下
[root@localhost main5]#gcc -o hello hello.c hello.so
//將hello.c編譯鏈接為hello的可執行程序,這個過程用到了動態鏈接庫hello.so
在這里要廢話幾句,其實一切的二進制信息都有其運作的機制,只要弄清楚了它的機制,並能夠實現之,則任何此時此刻無法想像之事都將成為現實。當然,這兩者之間的巨大鴻溝需要頂級的設計思想和頂級的代碼來跨越。
㈥ 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編譯生成動態鏈接庫*.so文件
生成動態鏈接庫的命令行為:
gcc -fPIC -shared -o libstr.so
當將main.c和動態鏈接庫進行連接生成可執行文件 的命令如下:
gcc main.c -L./ -lstr -o main或者gcc -o main main.c -L./ -lstr
測試是否動態鏈接,如果列出libstr.so, 那麼應該是連接正常了ldd main註:1)-L.:表示連接的庫在當前的目錄中。
㈧ gcc編譯流程
gcc編譯分為四部;
第一步,預編譯,將程序中的宏定義等預編譯;
第二步,編譯,將*.h,*.c等文件編譯成為*.o文件;
第三步,匯編;
第四步,連接,將*.o文件連接庫,生成可執行文件!
㈨ 請教,如何讓Gcc編譯生成的動態庫,包含符號表
item表示迭代的參數 比如你的這個數組通過request.setAttribute("array",xxx)放入了這個里,迭代的內容就是${requestScope.array}
var 相當於一個引用
下面你就可以用
${array.xxx1}
${array.xxx2}
將數組里的值輸出出來了
