個人博客首頁(點解查看詳情)-- https://blog.51cto.com/11495268
你所需要的網站建設服務,我們均能行業靠前的水平為你提供.標準是產品質量的保證,主要從事成都網站建設、網站制作、企業網站建設、成都手機網站制作、網頁設計、品牌網站制作、網頁制作、做網站、建網站。創新互聯公司擁有實力堅強的技術研發團隊及素養的視覺設計專才。
????程序編譯一般需要經預處理、編譯、匯編和鏈接,在實際應用中,有些公共代碼需要反復使用,就把這些代碼編譯成為 "庫" 文件,本文 主要 描述 Linux 平臺下 庫文件的 創建 和 鏈接 相關操作(既然都看 這么底層的內容了,相信 也有一定的基礎,所以本文 對相關命令 也不會進行詳細解釋)
備注:
????linux平臺下,靜態鏈接庫是以 .a 的后綴文件,動態鏈接庫是以 .so 的后綴文件
????widows平臺下,靜態鏈接庫是以 .lib 的后綴文件,動態庫文件是以 .dll 的后綴文件
????庫是寫好的 現有的、成熟的 一種可執行、可以復用代碼的二進制形式(注,其本身不可執行),可以被操作系統載入內存執行;分為 靜態鏈接庫 和 動態鏈接庫
????靜態鏈接庫可以簡單看成一組目標文件.o 的集合,即很多目標文件經過壓縮打包后形成的一個文件
????鏈接器將從 靜態(鏈接)庫 取得所需的代碼,復制到生成的可執行文件
????靜態庫對函數庫的鏈接是放在程序編譯時期完成
????程序在運行時對函數庫再無瓜葛(因為所有相關的目標文件和牽涉到的函數庫被鏈接合成一個可執行文件)
????浪費空間和資源(因為所有相關的目標文件和牽涉到的函數庫被鏈接合成一個可執行文件)

備注:
????linux下使用ar工具(windows下用lib.exe)將目標文件壓縮到一起,并且對其進行編號和索引,以便于查找和索引
????靜態鏈接庫的名稱 和 庫文件名稱不同但有聯系;例如,庫名稱為"static_library",那么起庫文件名為"libstatic_library.a"
????程序在開始運行后調用 動態(鏈接)庫(Dynamic Link Library)中的函數 才被載入
????程序編譯是并不會被連接到目標代碼中,而是在程序運行時才被載入
????動態庫把對一些庫函數的鏈接載入推遲到程序運行時期
????進程之間的相同動態庫實現共享
????創建動態庫與創建靜態庫不同,不需要打包工具,直接使用編譯器創建動態庫
# g++ -fPIC -shared -o libxxx.so xx1.cpp xx2.cpp xx3.cpp????
????動態鏈接庫的名稱 和 庫文件名稱不同但有聯系;例如,庫名稱為"dynamic_library",那么起庫文件名為"libdynamic_library.a"
# cat g++_lib_header.h
#ifndef __GXX_LIB_HEADER_H_
#define __GXX_LIB_HEADER_H_
#include <iostream>
using namespace std;
void gxx_lib_one();
void gxx_lib_two();
void gxx_lib_three();
#endif????
# cat g++_lib_first.cpp
/*
filename : g++_lib_first.cpp
*/
#include "g++_lib_header.h"
void gxx_lib_one(){
cout << "call gxx_lib_one() function" << endl;
}????
# cat g++_lib_sec.cpp
/*
filename : g++_lib_sec.cpp
*/
#include "g++_lib_header.h"
void gxx_lib_two(){
cout << "call gxx_lib_two() function" << endl;
}????
# cat g++_lib_third.cpp
/*
filename : g++_lib_third.cpp
*/
#include "g++_lib_header.h"
void gxx_lib_three(){
cout << "call gxx_lib_three() function" << endl;
}????
# cat g++_lib_main.cpp
/*
filename : g++_lib_main.cpp
*/
#include "g++_lib_header.h"
int main(int argc, char *argv[])
{
gxx_lib_one();
gxx_lib_two();
gxx_lib_three();
return 0;
}????
# g++ -c g++_lib_first.cpp
# g++ -c g++_lib_sec.cpp
# g++ -c g++_lib_third.cpp
# ar cqs libstatic_gxx.a g++_lib_first.o g++_lib_sec.o g++_lib_third.o????
## -L ./ 等同于 -L.
# g++ -o g++_lib_main_static g++_lib_main.cpp -L. -static -l static_gxx
# ./g++_lib_main_static
call gxx_lib_one() function
call gxx_lib_two() function
call gxx_lib_three() function????
????為了便于測試比較,使用 與 靜態庫編譯相同的源碼
# g++ -fPIC -shared -o libdynamic_gxx.so g++_lib_first.cpp g++_lib_sec.cpp g++_lib_third.cpp????
# g++ -o g++_lib_main_dynamic g++_lib_main.cpp -L ./ -l dynamic_gxx????
## 共享路徑設置 :
## 1@:LD_LIBRARY_PATH 修改 這個全局變量
## 2@:修改 /etc/ld.so.conf 配置
## 本文 就 詳細描述了,直接把 生成的共享庫 cp 至 系統默認路徑下
# cp libdynamic_gxx.so /usr/local/lib/????
備注:
????如果 不設置 共享路徑 或者 共享路徑下 找不到 指定的 庫文件,系統 就會 提示相關的錯誤信息:"./g++_lib_main_dynamic: error while loading shared libraries: libdynamic_gxx.so: cannot open shared object file: Error 40"
## 查看 依賴庫,沒有問題 就執行
# ldd g++_lib_main_dynamic
linux-vdso.so.1 => (0x00007ffcf73c1000)
libdynamic_gxx.so => /usr/local/lib/libdynamic_gxx.so (0x00007effbb5d0000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007effbb24e000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007effbae84000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007effbab7a000)
/lib64/ld-linux-x86-64.so.2 (0x000056545a3cb000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007effba964000)????
# ./g++_lib_main_dynamic
call gxx_lib_one() function
call gxx_lib_two() function
call gxx_lib_three() function????
# apt-get install make????
# cat Makef
default_target : help
help :
@echo "usage : make [opt]"
@echo "\topt arguement is one of \"static_gxx、dynamic_gxx\""
g++_lib_first.o : g++_lib_first.cpp g++_lib_header.h
g++ -c g++_lib_first.cpp
g++_lib_sec.o : g++_lib_sec.cpp g++_lib_header.h
g++ -c g++_lib_sec.cpp
g++_lib_third.o : g++_lib_third.cpp g++_lib_header.h
g++ -c g++_lib_third.cpp
static_gxx : g++_lib_first.o g++_lib_sec.o g++_lib_third.o
ar cqs /tmp/libstatic_gxx.a g++_lib_first.o g++_lib_sec.o g++_lib_third.o
g++ -o g++_lib_main g++_lib_main.cpp -L /tmp -static -l static_gxx
dynamic_gxx :
g++ -fPIC -shared -o /tmp/libdynamic_gxx.so g++_lib_first.cpp g++_lib_sec.cpp g++_lib_third.cpp
g++ -o g++_lib_main_dynamic g++_lib_main.cpp -L /tmp -l dynamic_gxx
cp /tmp/libdynamic_gxx.so /usr/local/lib/
ldconfig ????
## 創建 靜態庫 鏈接的 可執行文件
# make static_gxx
ar cqs /tmp/libstatic_gxx.a g++_lib_first.o g++_lib_sec.o g++_lib_third.o
g++ -o g++_lib_main g++_lib_main.cpp -L /tmp -static -l static_gxx
## 創建 動態庫 鏈接的 可執行文件
# make dynamic_gxx
g++ -fPIC -shared -o /tmp/libdynamic_gxx.so g++_lib_first.cpp g++_lib_sec.cpp g++_lib_third.cpp
g++ -o g++_lib_main_dynamic g++_lib_main.cpp -L /tmp -l dynamic_gxx
cp /tmp/libdynamic_gxx.so /usr/local/lib/
分享文章:Linuxg++鏈接庫編譯、鏈接以及Makefile編寫
本文鏈接:http://www.yijiale78.com/article44/ghdche.html
成都網站建設公司_創新互聯,為您提供網站排名、外貿網站建設、、企業網站制作、建站公司、搜索引擎優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯