0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

C++基礎語法知識之鏈接裝載庫中Linux 的共享庫

C語言編程學習基地 ? 來源:C語言編程學習基地 ? 作者: C語言編程 ? 2021-11-01 10:15 ? 次閱讀

Linux 的共享庫(Shared Library)

Linux 下的共享庫就是普通的 ELF 共享對象。

共享庫版本更新應該保證二進制接口 ABI(Application Binary Interface)的兼容

命名

libname.so.x.y.z

x:主版本號,不同主版本號的庫之間不兼容,需要重新編譯

y:次版本號,高版本號向后兼容低版本號

z:發(fā)布版本號,不對接口進行更改,完全兼容

路徑

大部分包括 Linux 在內(nèi)的開源系統(tǒng)遵循 FHS(File Hierarchy Standard)的標準,這標準規(guī)定了系統(tǒng)文件如何存放,包括各個目錄結(jié)構(gòu)、組織和作用。

/lib:存放系統(tǒng)最關鍵和最基礎的共享庫,如動態(tài)鏈接器、C 語言運行庫、數(shù)學庫等

/usr/lib:存放非系統(tǒng)運行時所需要的關鍵性的庫,主要是開發(fā)庫

/usr/local/lib:存放跟操作系統(tǒng)本身并不十分相關的庫,主要是一些第三方應用程序的庫

動態(tài)鏈接器會在/lib、/usr/lib和由/etc/ld.so.conf配置文件指定的,目錄中查找共享庫

環(huán)境變量

LD_LIBRARY_PATH:臨時改變某個應用程序的共享庫查找路徑,而不會影響其他應用程序

LD_PRELOAD:指定預先裝載的一些共享庫甚至是目標文件

LD_DEBUG:打開動態(tài)鏈接器的調(diào)試功能

so 共享庫的編寫

使用 CLion 編寫共享庫

創(chuàng)建一個名為 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

#ifndef MYSHAREDLIB_LIBRARY_H#define MYSHAREDLIB_LIBRARY_H
// 打印 Hello World!void hello();
// 使用可變模版參數(shù)求和template <typename T>T sum(T t){    return t;}template <typename T, typename ...Types>T sum(T first, Types ... rest){    return first + sum(rest...);}
#endif

library.cpp

#include #include "library.h"
void hello() {    std::cout << "Hello, World!" << std::endl;}

so 共享庫的使用(被可執(zhí)行項目調(diào)用)

使用 CLion 調(diào)用共享庫

創(chuàng)建一個名為 TestSharedLib 的可執(zhí)行項目

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

#include #include "library.h"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;}

執(zhí)行結(jié)果

Hello, World!1 + 2 = 31+2+3=6

今天的分享就到這里了,大家要好好學C++喲~

編輯:jq
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11310

    瀏覽量

    209616
  • 動態(tài)
    +關注

    關注

    0

    文章

    70

    瀏覽量

    20648
  • C++
    C++
    +關注

    關注

    22

    文章

    2109

    瀏覽量

    73677

原文標題:C++基礎語法梳理:鏈接裝載庫丨Linux 的共享庫

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux動態(tài)鏈接庫的基本概念

    學習Linux動態(tài)鏈接庫是一個繞不開的話題,我們今天就一起來看一下什么是動態(tài)鏈接庫、動態(tài)鏈接庫有什么好處、如何編譯出一個動態(tài)鏈接庫等幾個關于
    發(fā)表于 09-27 14:31 ?1552次閱讀

    [分享資料]程序員的自我修養(yǎng)—鏈接、裝載

    譯、鏈接和運行時刻所發(fā)生的各種事項,包括:代碼指令是如何保存的,文件如何與應用程序代碼靜態(tài)鏈接,應用程序如何被裝載到內(nèi)存并開始運行,動態(tài)
    發(fā)表于 09-11 22:13

    Linux系統(tǒng)共享編程

    一、說明 類似Windows系統(tǒng)的動態(tài)鏈接庫,Linux也有相應的共享用以支持代碼的復用
    發(fā)表于 09-13 16:49 ?24次下載

    C++動態(tài)鏈接庫的創(chuàng)建和調(diào)用

    動態(tài)連接的創(chuàng)建步驟: 一、創(chuàng)建Non-MFC DLL動態(tài)鏈接庫 1、打開File —> New —> Project選項,選擇Win32 Dynamic-Link Library —>sample project —>工程名:DllDemo
    發(fā)表于 11-24 18:13 ?7次下載

    Linux下靜態(tài)和動態(tài)共享)的制作與使用

    Linux下靜態(tài)和動態(tài)共享)的制作與使用Linux
    發(fā)表于 07-09 14:39 ?1178次閱讀

    c++標準手冊

    C++的標準手冊,新手學習的好資料,同時也是開發(fā)人員的必備手冊。里面涵蓋了標準C++的所有的庫函數(shù)。
    發(fā)表于 11-03 14:05 ?43次下載

    你知道linux 靜態(tài)共享

    靜態(tài)鏈接庫和動態(tài)鏈接庫的區(qū)別在于,主程序在運行前,靜態(tài)鏈接庫鏈接固定寫入在程序,而動態(tài)鏈接庫
    發(fā)表于 04-26 16:46 ?2904次閱讀

    linux共享程序剖析

    符號鏈接的原因。 共享程序是現(xiàn)代 UNIX? 系統(tǒng)中有效利用空間和資源的基礎。SUSE 系統(tǒng)C 程序
    發(fā)表于 04-02 14:35 ?296次閱讀

    Linux共享的構(gòu)造函數(shù)和析構(gòu)函數(shù)

    共享有類似C++類構(gòu)造和析構(gòu)函數(shù)的函數(shù),當動態(tài)加載和卸載的時候,函數(shù)會被分別執(zhí)行。一個函數(shù)加上 constructor的 attribute就成了構(gòu)造函數(shù);加上 destructo
    的頭像 發(fā)表于 06-22 09:18 ?2332次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>共享</b><b class='flag-5'>庫</b>的構(gòu)造函數(shù)和析構(gòu)函數(shù)

    嵌入式Linux下動態(tài)和靜態(tài)使用

    以下主要介紹Linux 下動態(tài)、靜態(tài)、如何使用已有的動態(tài), 以及如何制作一個動態(tài)Linux
    發(fā)表于 11-01 16:57 ?1次下載
    嵌入式<b class='flag-5'>Linux</b>下動態(tài)<b class='flag-5'>庫</b>和靜態(tài)<b class='flag-5'>庫</b>使用

    C++基礎語法梳理Windows 的動態(tài)鏈接庫

    [], TCHAR *envp[]); Windows 的動態(tài)鏈接庫(Dynamic-Link Library) 部分知識點來自《Windows 核心編程(第五版)》 用處 (1)擴展了應用程序的特性 (2)簡化了項目管理 (3)有助于
    的頭像 發(fā)表于 11-02 09:21 ?1787次閱讀
    <b class='flag-5'>C++</b>基礎<b class='flag-5'>語法</b>梳理<b class='flag-5'>之</b>Windows 的動態(tài)<b class='flag-5'>鏈接庫</b>

    Linux下的靜態(tài)鏈接庫和動態(tài)鏈接庫的區(qū)別是什么?

    學習Linux動態(tài)鏈接庫是一個繞不開的話題,我們今天就一起來看一下什么是動態(tài)鏈接庫、動態(tài)鏈接庫有什么好處、如何編譯出一個動態(tài)鏈接庫等幾個關于
    的頭像 發(fā)表于 02-17 10:49 ?1287次閱讀
    <b class='flag-5'>Linux</b>下的靜態(tài)<b class='flag-5'>鏈接庫</b>和動態(tài)<b class='flag-5'>鏈接庫</b>的區(qū)別是什么?

    Linux的靜態(tài)共享

    是一個二進制文件,包含的代碼可被程序調(diào)用。例如標準C、數(shù)學、線程等等。有源碼,可下載后
    的頭像 發(fā)表于 05-10 09:34 ?1046次閱讀

    CC++編寫環(huán)境下LabVIEW如何調(diào)用動態(tài)?

    C語言編寫的動態(tài)鏈接庫相比,不同的地方在于extern int “C” __declspec(dllexport) add(int x,int y) 這一導出語句,在C代碼
    發(fā)表于 06-11 09:15 ?7785次閱讀
    <b class='flag-5'>C</b>和<b class='flag-5'>C++</b>編寫環(huán)境下LabVIEW如何調(diào)用動態(tài)<b class='flag-5'>庫</b>?

    如何查看linux程序共享呢?

    linux系統(tǒng),程序通常需要依賴于外部來正常工作。這些可以直接編譯到程序,也可以從共享
    的頭像 發(fā)表于 08-28 09:11 ?1610次閱讀
    如何查看<b class='flag-5'>linux</b>程序<b class='flag-5'>共享</b><b class='flag-5'>庫</b>呢?