C++基础语法知识之链接装载库中Linux 的共享库

描述

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(TestSharedLib MySharedLib)

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
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分