Linux 的共享庫(Shared Library)
Linux 下的共享庫就是普通的 ELF 共享對象。
共享庫版本更新應該保證二進制接口 ABI(Application Binary Interface)的兼容
命名
libname.so.x.y.z
x:主版本號,不同主版本號的庫之間不兼容,需要重新編譯
y:次版本號,高版本號向后兼容低版本號
z:發布版本號,不對接口進行更改,完全兼容
路徑
大部分包括 Linux 在內的開源系統遵循 FHS(File Hierarchy Standard)的標準,這標準規定了系統文件如何存放,包括各個目錄結構、組織和作用。
/lib:存放系統最關鍵和最基礎的共享庫,如動態鏈接器、C 語言運行庫、數學庫等
/usr/lib:存放非系統運行時所需要的關鍵性的庫,主要是開發庫
/usr/local/lib:存放跟操作系統本身并不十分相關的庫,主要是一些第三方應用程序的庫
動態鏈接器會在/lib、/usr/lib和由/etc/ld.so.conf配置文件指定的,目錄中查找共享庫
環境變量
LD_LIBRARY_PATH:臨時改變某個應用程序的共享庫查找路徑,而不會影響其他應用程序
LD_PRELOAD:指定預先裝載的一些共享庫甚至是目標文件
LD_DEBUG:打開動態鏈接器的調試功能
so 共享庫的編寫
使用 CLion 編寫共享庫
創建一個名為 MySharedLib 的共享庫
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MySharedLib)
set(CMAKE_CXX_STANDARD 11)
add_library(MySharedLib SHARED library.cpp library.h)
library.h
// 打印 Hello World!
void hello();
// 使用可變模版參數求和
template <typename T>
T sum(T t)
{
return t;
}
template <typename T, typename ...Types>
T sum(T first, Types ... rest)
{
return first + sum
(rest...); }
library.cpp
void hello() {
std::cout << "Hello, World!" << std::endl;
}
so 共享庫的使用(被可執行項目調用)
使用 CLion 調用共享庫
創建一個名為 TestSharedLib 的可執行項目
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(TestSharedLib)
# C++11 編譯
set(CMAKE_CXX_STANDARD 11)
# 頭文件路徑
set(INC_DIR /home/xx/code/clion/MySharedLib)
# 庫文件路徑
set(LIB_DIR /home/xx/code/clion/MySharedLib/cmake-build-debug)
include_directories(${INC_DIR})
link_directories(${LIB_DIR})
link_libraries(MySharedLib)
add_executable(TestSharedLib main.cpp)
# 鏈接 MySharedLib 庫
target_link_libraries(TestSharedLibMySharedLib)
main.cpp
using std::cout;
using std::endl;
int main() {
hello();
cout << "1 + 2 = " << sum(1,2) << endl;
cout << "1 + 2 + 3 = " << sum(1,2,3) << endl;
return 0;
}
執行結果
World!
1 + 2 = 3
6 =
今天的分享就到這里了,大家要好好學C++喲~
-
Linux
+關注
關注
87文章
11345瀏覽量
210414 -
動態
+關注
關注
0文章
70瀏覽量
20704 -
C++
+關注
關注
22文章
2114瀏覽量
73859
原文標題:C++基礎語法梳理:鏈接裝載庫丨Linux 的共享庫
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
Linux動態鏈接庫的基本概念
[分享資料]程序員的自我修養—鏈接、裝載與庫
C++中動態鏈接庫的創建和調用
Linux共享庫的構造函數和析構函數
![<b class='flag-5'>Linux</b><b class='flag-5'>共享</b><b class='flag-5'>庫</b>的構造函數和析構函數](https://file.elecfans.com/web1/M00/BF/17/o4YBAF7wBbOAZUG3AABYNqcA_-Q606.png)
C++基礎語法梳理之Windows 的動態鏈接庫
![<b class='flag-5'>C++</b>基礎<b class='flag-5'>語法</b>梳理<b class='flag-5'>之</b>Windows 的動態<b class='flag-5'>鏈接庫</b>](https://file.elecfans.com/web2/M00/1A/DB/poYBAGGAk5-AaGODAAAjIPYyhzg247.png)
C和C++編寫環境下LabVIEW如何調用動態庫?
![<b class='flag-5'>C</b>和<b class='flag-5'>C++</b>編寫環境下LabVIEW如何調用動態<b class='flag-5'>庫</b>?](https://file1.elecfans.com/web2/M00/89/76/wKgaomSFINaAFh8wAAAk5Cpt4CI042.png)
評論