gcc編譯鏈接庫
Ⅰ 如何用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.:表示連接的庫在當前的目錄中。
Ⅱ 包含unistd.h gcc編譯應該鏈接什麼庫
生成動態鏈接庫的命令行為: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.:表示連接的庫在當前的目錄中。
Ⅲ linux下GCC 編譯時為什麼要指定鏈接庫
答:
首先,libpthread.a一般在/usr/lib下不可能在/usr/include/lib下吧?
/usr/lib下有很多庫,gcc默認只載入c/c++語言使用的標准庫,如標准io庫(如printf)和標准模板庫(stl,g++),
其它的庫都載入的話程序就太大了
gcc也不會自動去尋找系統中的所有庫,誰知道你系統中有多少庫呢?
Ⅳ GCC編譯鏈接printf所在庫的問題
鏈接的是動態庫 libc.so.6 (後面的數字可能不同,一般是這個)動態庫在編譯的時候是不用鏈的,執行的時候載入。
Ⅳ 關於linux下連接動態庫問題
gcc編譯時,當使用動態庫編譯可以按照幾種寫法
1.gcc test.c ./libSDL2-2.so
2.gcc test.c -lSDL2-2
3.gcc test.c -L/home/test -lSDL2-2
一般的編譯參數都是按照2或3去寫
2寫法的含義是從/lib或者/usr/lib目錄下尋找名稱為SDL2-2的庫,即尋找/lib/libSDL2-2.so或者/usr/lib/libSDL2-2.so文件進行鏈接,當然如果沒有動態庫就會去找靜態庫,再沒有應該就會在編譯時報錯
3寫法的含義是從-L參數首先從指定的目錄中尋找需要鏈接的庫文件,隨後再去尋找系統文件夾中是否存在需要的庫
1寫法的含義是將當前目錄下的./libSDL2-2.so.0文件鏈接進最終文件,因此執行readelf -a a.out後在動態庫部分所看到的路徑就是./libSDL2-2.so.0,進而在執行文件時僅會從當前目錄下尋找libSDL2-2.so.0文件,當執行文件時所在的目錄下沒有該文件時就會出現找不到庫文件的操作
你第二次操作時,因為function.so庫文件與a.out文件在同一個目錄,同時也是在該目錄下執行的ldd操作及運行a.out,a.out在載入動態庫時從當前目錄下找到了所需要的庫文件,此時能夠執行成功(ldd命令實質是一個腳本,通過設置環境變數運行動態庫鏈接器來輸出所有待鏈接的動態庫)。
你可以試試將a.out拷貝至其他目錄再次運行,將出現和第一次操作時一樣的現象,找不到function.so文件。
具體的解決方法就是修改編譯參數,將./libSDL2-2.so.0修改為-lSDL2-2並將libSDL2-2.so.0文件拷貝至/usr/lib目錄下,並且可能因為沒有修改鏈接器的緩存文件(將可能找不到帶版本號後綴的動態庫),需要在/usr/lib目錄下建立一個文件連接(ln -s libSDL2-2.so.0 libSDL2-2.so)或者直接修改名稱為libSDL2-2.so