原始碼:
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...