Linux gcc g 靜態庫與動態庫

2021-08-17 17:04:50 字數 1424 閱讀 5278

原始碼:

test.h

#pragma once

void test();

test.c

#include"stdio.h"

void test()

hello.h

#pragma once

void hello(const char* name);

hello.c

#include"stdio.h"

#include"hello.h"

void hello(const char* name)

main.c

#include"hello.h"

#include"test.h"

int main()

靜態庫

1.編譯hello和test,生成對應的*.o檔案

2.生成靜態庫檔案myfun,ar rcs libmyfun.a hello.o test.o

4.主程式執行不依賴於靜態庫,可刪除靜態庫檔案。./main

動態庫1.生成棟態庫檔案myf, gcc -shared -fpic -o libmyf.so test.c  hello.c

3.主程式執行依賴於動態庫,不能刪除動態庫檔案,否則主程式無法執行。

注:如果提示找不到動態庫檔案。可通過以下方案解決:

1) 如果共享庫檔案安裝到了/lib或/usr/lib目錄下, 那麼需執行一下ldconfig命令

# cat /etc/ld.so.conf

include ld.so.conf.d/*.conf

# echo "/usr/local/lib" >> /etc/ld.so.conf

#ldconfig

3) 如果共享庫檔案安裝到了其它"非/lib或/usr/lib" 目錄下,  但是又不想在/etc/ld.so.conf中加路徑(或者是沒有許可權加路徑). 那可以export乙個全域性變數ld_library_path, 然後執行程式的時候就會去這個目錄中找共享庫.

ld_library_path的意思是告訴loader在哪些目錄中可以找到共享庫. 可以設定多個搜尋目錄, 這些目錄之間用冒號分隔開. 比如安裝了乙個mysql到/usr/local/mysql目錄下, 其中有一大堆庫檔案在/usr/local/mysql/lib下面, 則可以在.bashrc或.bash_profile或shell裡加入以下語句即可:

export ld_library_path=/usr/local/mysql/lib:$ld_library_path   

一般來講這只是一種臨時的解決方案, 在沒有許可權或臨時需要的時候使用.

Linux GCC G 生成動態庫或者靜態庫

生成靜態庫之前要使用 gcc c 編譯生成 o 檔案 然後使用 ar rcs a o 生成靜態庫 動態庫有別名 真名 鏈結名。命令 gcc shared fpic wl,soname,libname.so o libname.so.0 c shared 動態鏈結庫 fpic 生成的鏈結庫與路徑無關 ...

靜態庫與動態庫

linux下靜態庫 a 的例子 mylib.h 位於include資料夾下 ifndef mylib h define mylib h int add int a,int b endif mylib.cpp 位於lib資料夾中 include mylib.h int add int a,int b ...

靜態庫與動態庫

庫本質上是一種可執行的二進位制 可以被作業系統載入 linux和windows的庫是不相容的 庫可以分為靜態塊和動態庫,二者的不同點在於 被載入的時刻不同。靜態庫 在程式編譯時會被連線到目標 中,程式執行時不再需要改靜態庫,體積較大,一般應用與移植過程中在宿主機上編譯的 靜態庫檔名的命名規範是以li...