前言:
? ? ? ? 上文我們講到了文件系統【Linux系統】詳解Ext2,文件系統-CSDN博客
? ? ? ? 本文我們來講講動靜態庫的制作
庫
? ? ? ??【Linux】編譯器gcc/g++及其庫的詳細介紹_linux gcc 有哪些庫-CSDN博客
? ? ? ? 這篇文章的第4大點,簡單是介紹了一下庫的基本概念。
靜態庫
? ? ? ? 靜態庫的本質是一種歸檔文件,對所有.o文件進行了打包!
? ? ? ? 不需要使用者解包,而直接使用gcc/g++進行鏈接即可!
#先將所有的 .c文件編譯出 .o問文件
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ls
mstr.c mstr.h my.c my.h
yc@hyc-alicloud:~/linux/動靜態庫的制作/new$ gcc -c *.c
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ls
mstr.c mstr.h mstr.o my.c my.h my.o#再將全部 .o文件打包為靜態庫(不包含main函數!)
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ar -cr libmyc.a *o
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ls
libmyc.a mstr.c mstr.h mstr.o my.c my.h my.o
? ? ? ? 如上,靜態庫就這樣制作完成了!
????????ar是歸檔工具,將多個.o文件打包成一個文件。選項:-rc表示replace and creat
進行鏈接:
? ? ? ? 我們要鏈接任何非標準庫(包括第三方庫、自己寫的庫)都必須指明-L? -l!
? ? ? ? -L:表示去哪里找庫
? ? ? ? -l:表示找那個庫
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ls
libmyc.a mstr.c mstr.h mstr.o my.c my.h my.o test.c
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ gcc -c *.c
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ls
libmyc.a mstr.c mstr.h mstr.o my.c my.h my.o test.c test.o
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ gcc -o test test.o -L . -l myc
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ./test
0 1 2 3 4 5 6 7 8 9
? ? ? ? 鏈接完成,形成可執行程序!
? ? ? ? 注:.h文件的意義就是作為方法手冊
hyc@hyc-alicloud:~/linux/動靜態庫的制作$ ls
lib new test.c
hyc@hyc-alicloud:~/linux/動靜態庫的制作$ tree lib
lib
├── include
│?? ├── mstr.h
│?? └── my.h
└── mylib└── libmyc.a3 directories, 3 fileshyc@hyc-alicloud:~/linux/動靜態庫的制作$ gcc -o test test.c -I ./lib/include -L ./lib/mylib -l myc
hyc@hyc-alicloud:~/linux/動靜態庫的制作$ ls
lib new test test.c
hyc@hyc-alicloud:~/linux/動靜態庫的制作$ ./test
0 1 2 3 4 5 6 7 8 9
? ? ? ? 當頭文件并不在當前目錄或系統中,就想要 -I選項
? ? ? ? -I:表示去哪里找頭文件。
補充:
? ? ? ? 庫也是要被安裝到系統中的!!!
? ? ? ? 我們正常使用庫,是不可能像上面一樣麻煩的!
? ? ? ? 只需要將頭文件、庫拷貝至系統文件下的默認路徑,以后調用就只需要指明庫名字即可。? ? ?
? ? ? ? 默認路徑:/usr/include,/lib64
動態庫
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ls
mstr.c mstr.h my.c my.h#先將.c文件編譯成.o
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ gcc -fPIC -c *.c
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ls
mstr.c mstr.h mstr.o my.c my.h my.o#再將.o文件打包
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ gcc -shared -o libmyc.so *.o
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ls
libmyc.so mstr.c mstr.h mstr.o my.c my.h my.o
? ? ? ? 編譯為.o文件:fPIC:產生位置無關碼(position independent code)
? ? ? ? 打包:與靜態庫使用ar打包不同,動態庫依舊使用gcc進行打包,使用 -shared選項:表示生成共享庫格式
進行鏈接:
hyc@hyc-alicloud:~/linux/動靜態庫的制作$ ls
lib new test.c
hyc@hyc-alicloud:~/linux/動靜態庫的制作$ tree lib
lib
├── include
│?? ├── mstr.h
│?? └── my.h
└── mylib├── libmyc.a└── libmyc.so3 directories, 4 fileshyc@hyc-alicloud:~/linux/動靜態庫的制作$ gcc -o test test.c -I ./lib/include -L ./lib/mylib -l myc
hyc@hyc-alicloud:~/linux/動靜態庫的制作$ ls
lib new test test.chyc@hyc-alicloud:~/linux/動靜態庫的制作$ ./test
./test: error while loading shared libraries: libmyc.so: cannot open shared object file: No such file or directory
? ? ? ? 如上,我們依舊將所有位置信息告知,鏈接成功得到可執行程序!
? ? ? ? 但是當我們執行可執行程序時,卻發現報錯了!?libmyc.so不打開,不存在?為什么?
hyc@hyc-alicloud:~/linux/動靜態庫的制作$ ldd testlinux-vdso.so.1 (0x00007fff3f37a000)libmyc.so => not foundlibc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbfed7ba000)/lib64/ld-linux-x86-64.so.2 (0x00007fbfed9f1000)
? ? ? ? 因為,我們只告訴了編譯器gcc這些信息,但是并沒有告訴操作系統!
????????靜態庫為什么這問題?因為靜態庫在加載的時候,就已經將庫加載到可執行程序里面了!而動態庫沒有,執行時還需要去查找對應的庫。
解決方法:
????????1.將我們寫的庫直接拷貝到操作系統中
? ? ? ? 2.建立軟連接:在操作系統中新建一個同名庫,并將其與我們自己的庫建立軟連接
? ? ? ? 3.創建/修改環境變量:LD_LIBRARY_PATH(導入庫的路徑)
? ? ? ? 4.ldconfig方案:配置/ etc/ld.so.conf.d/ ,更新ldconfig
補充:
? ? ? ? 1.動靜態庫同時提供,gcc/g++,默認是使用動態鏈接、動態庫!
? ? ? ? ? ?非要靜態鏈接,只能使用 -static(靜態庫必須存在!)
? ? ? ? ? ?只存在靜態庫,當然就默認靜態鏈接了
? ? ? ? 2.Linux下,默認優先安裝動態庫