动态库和静态库的创建
生活随笔
收集整理的這篇文章主要介紹了
动态库和静态库的创建
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
庫:一組別人實現好的函數接口
1.命名方法?
靜態庫 : libname.a? 動態庫 : libname.so?
注意 ? :庫的名字是name?
2.鏈接動態庫和靜態庫的區別?
預處理,編譯,匯編,鏈接(連接庫)
(1)鏈接靜態庫? 如果鏈接的是靜態庫,編譯器將程序中調用的庫中函數接口的實現代碼鏈接到可執行 文件中,生成可執行文件體積大.程序運行的時候,不需要庫支持。?
(2)鏈接動態庫? 如果鏈接的是動態庫,編譯器將程序中調用的函數所在的庫的名字記錄在可執行文件中 ,生成可執行文件體積小.程序運行的時候,需要[OS]加載動態庫。
3.制作靜態庫
(1)將.c文件編譯成.o文件 ? gcc -c file.c -o file.o? ....?
(2)將.o文件打包成靜態庫? ar -cr libname.a ?*.o?
4.gcc 鏈接庫的參數?
注意:gcc 默認到/usr/lib 和/lib鏈接庫,gcc只能識別它自帶的庫,第三方庫[不是編譯器自帶庫]無法識別?
-L ?告訴編譯器庫的路徑? -l ?告訴編譯器庫的名字?
例如: gcc main.c -L 庫的路徑 -l庫的名字
5.制作動態庫?
(1)將.c文件編譯成.o文件 ? gcc -c file.c -o file.o? ....?
(2)將.o文件打包成動態庫? gcc -shared *.o -o libname.so?
--------------------------------------------------- 查看可執行文件所依賴的動態庫: readelf -a ?可執行文件名 | grep "Shared" ----------------------------------------------------
6. OS 加載庫的時候,默認的搜索路徑?
(1)環境變量LD_LIBRARY_PATH所包含的路徑?
添加環境變量: export ?環境變量名=$環境變量名:新的路徑
注意: 直接通過export命令,是臨時添加,如果永久有效,將命令寫道配置文件 <1>用戶主目錄下的.bashrc文件 [當前登錄的用戶打開終端的時候會執行一次] <2>/etc/bash.bashrc ? ? ? ? ?[所有的用戶打開終端的時候都會執行一次]
例如: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/linux/mylib
(2)/usr/lib 和 /lib?
7.當靜態庫和動態庫同時存在,編譯器默認鏈接的是動態庫 。? 如果想強制鏈接靜態庫,需要加上 -static 參數 ?
8.給庫加上版本號?
libtest.so.0.1 , libtest.so.0.2?
讓編譯器鏈接庫成功,必須創建創建一個軟鏈接?
ln -s libtest.so.0.2 ?libtest.so
1.命名方法?
靜態庫 : libname.a? 動態庫 : libname.so?
注意 ? :庫的名字是name?
2.鏈接動態庫和靜態庫的區別?
預處理,編譯,匯編,鏈接(連接庫)
(1)鏈接靜態庫? 如果鏈接的是靜態庫,編譯器將程序中調用的庫中函數接口的實現代碼鏈接到可執行 文件中,生成可執行文件體積大.程序運行的時候,不需要庫支持。?
(2)鏈接動態庫? 如果鏈接的是動態庫,編譯器將程序中調用的函數所在的庫的名字記錄在可執行文件中 ,生成可執行文件體積小.程序運行的時候,需要[OS]加載動態庫。
3.制作靜態庫
(1)將.c文件編譯成.o文件 ? gcc -c file.c -o file.o? ....?
(2)將.o文件打包成靜態庫? ar -cr libname.a ?*.o?
4.gcc 鏈接庫的參數?
注意:gcc 默認到/usr/lib 和/lib鏈接庫,gcc只能識別它自帶的庫,第三方庫[不是編譯器自帶庫]無法識別?
-L ?告訴編譯器庫的路徑? -l ?告訴編譯器庫的名字?
例如: gcc main.c -L 庫的路徑 -l庫的名字
5.制作動態庫?
(1)將.c文件編譯成.o文件 ? gcc -c file.c -o file.o? ....?
(2)將.o文件打包成動態庫? gcc -shared *.o -o libname.so?
--------------------------------------------------- 查看可執行文件所依賴的動態庫: readelf -a ?可執行文件名 | grep "Shared" ----------------------------------------------------
6. OS 加載庫的時候,默認的搜索路徑?
(1)環境變量LD_LIBRARY_PATH所包含的路徑?
添加環境變量: export ?環境變量名=$環境變量名:新的路徑
注意: 直接通過export命令,是臨時添加,如果永久有效,將命令寫道配置文件 <1>用戶主目錄下的.bashrc文件 [當前登錄的用戶打開終端的時候會執行一次] <2>/etc/bash.bashrc ? ? ? ? ?[所有的用戶打開終端的時候都會執行一次]
例如: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/linux/mylib
(2)/usr/lib 和 /lib?
7.當靜態庫和動態庫同時存在,編譯器默認鏈接的是動態庫 。? 如果想強制鏈接靜態庫,需要加上 -static 參數 ?
8.給庫加上版本號?
libtest.so.0.1 , libtest.so.0.2?
讓編譯器鏈接庫成功,必須創建創建一個軟鏈接?
ln -s libtest.so.0.2 ?libtest.so
總結
以上是生活随笔為你收集整理的动态库和静态库的创建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 51nod 1836:战忽局的手段(期望
- 下一篇: 消除数组中重复元素的方法