0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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:发布版本号,不对接口进行更改,完全兼容

路径

大部分包括 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

#ifndef MYSHAREDLIB_LIBRARY_H#define MYSHAREDLIB_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...);}
#endif

library.cpp

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

#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;}

执行结果

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

今天的分享就到这里了,大家要好好学C++哟~

编辑:jq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11232

    浏览量

    208943
  • 动态
    +关注

    关注

    0

    文章

    70

    浏览量

    20618
  • C++
    C++
    +关注

    关注

    22

    文章

    2104

    浏览量

    73502

原文标题:C++基础语法梳理:链接装载库丨Linux 的共享库

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux动态链接库的基本概念

    学习Linux动态链接库是一个绕不开的话题,我们今天就一起来看一下什么是动态链接库、动态链接库有什么好处、如何编译出一个动态链接库等几个关于
    发表于 09-27 14:31 1525次阅读

    [分享资料]程序员的自我修养—链接装载

    译、链接和运行时刻所发生的各种事项,包括:代码指令是如何保存的,文件如何与应用程序代码静态链接,应用程序如何被装载到内存并开始运行,动态
    发表于 09-11 22:13

    Linux系统共享编程

    一、说明 类似Windows系统的动态链接库Linux也有相应的共享用以支持代码的复用
    发表于 09-13 16:49 24次下载

    C++动态链接库的创建和调用

    动态连接的创建步骤: 一、创建Non-MFC DLL动态链接库 1、打开File —> New —> Project选项,选择Win32 Dynamic-Link Library —>sample project —>工程名:DllDemo
    发表于 11-24 18:13 7次下载

    Linux下静态和动态共享)的制作与使用

    Linux下静态和动态共享)的制作与使用Linux
    发表于 07-09 14:39 1155次阅读

    c++标准手册

    C++的标准手册,新手学习的好资料,同时也是开发人员的必备手册。里面涵盖了标准C++的所有的库函数。
    发表于 11-03 14:05 43次下载

    你知道linux 静态共享

    静态链接库和动态链接库的区别在于,主程序在运行前,静态链接库链接固定写入在程序,而动态链接库
    发表于 04-26 16:46 2885次阅读

    linux共享程序剖析

    符号链接的原因。 共享程序是现代 UNIX® 系统中有效利用空间和资源的基础。SUSE 系统C 程序
    发表于 04-02 14:35 288次阅读

    Linux共享的构造函数和析构函数

    共享有类似C++类构造和析构函数的函数,当动态加载和卸载的时候,函数会被分别执行。一个函数加上 constructor的 attribute就成了构造函数;加上 destructo
    的头像 发表于 06-22 09:18 2308次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>共享</b><b class='flag-5'>库</b>的构造函数和析构函数

    嵌入式Linux下动态和静态使用

    以下主要介绍Linux 下动态、静态、如何使用已有的动态, 以及如何制作一个动态Linux
    发表于 11-01 16:57 1次下载
    嵌入式<b class='flag-5'>Linux</b>下动态<b class='flag-5'>库</b>和静态<b class='flag-5'>库</b>使用

    C++基础语法梳理Windows 的动态链接库

    [], TCHAR *envp[]); Windows 的动态链接库(Dynamic-Link Library) 部分知识点来自《Windows 核心编程(第五版)》 用处 (1)扩展了应用程序的特性 (2)简化了项目管理 (3)有助于
    的头像 发表于 11-02 09:21 1769次阅读
    <b class='flag-5'>C++</b>基础<b class='flag-5'>语法</b>梳理<b class='flag-5'>之</b>Windows 的动态<b class='flag-5'>链接库</b>

    Linux下的静态链接库和动态链接库的区别是什么?

    学习Linux动态链接库是一个绕不开的话题,我们今天就一起来看一下什么是动态链接库、动态链接库有什么好处、如何编译出一个动态链接库等几个关于
    的头像 发表于 02-17 10:49 1244次阅读
    <b class='flag-5'>Linux</b>下的静态<b class='flag-5'>链接库</b>和动态<b class='flag-5'>链接库</b>的区别是什么?

    Linux的静态共享

    是一个二进制文件,包含的代码可被程序调用。例如标准C、数学、线程等等。有源码,可下载后
    的头像 发表于 05-10 09:34 1006次阅读

    CC++编写环境下LabVIEW如何调用动态

    C语言编写的动态链接库相比,不同的地方在于extern int “C” __declspec(dllexport) add(int x,int y) 这一导出语句,在C代码
    发表于 06-11 09:15 7577次阅读
    <b class='flag-5'>C</b>和<b class='flag-5'>C++</b>编写环境下LabVIEW如何调用动态<b class='flag-5'>库</b>?

    如何查看linux程序共享呢?

    linux系统,程序通常需要依赖于外部来正常工作。这些可以直接编译到程序,也可以从共享
    的头像 发表于 08-28 09:11 1553次阅读
    如何查看<b class='flag-5'>linux</b>程序<b class='flag-5'>共享</b><b class='flag-5'>库</b>呢?