首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux上的C++动态共享库

在Linux上,C++动态共享库是一种特殊类型的库,它允许在程序运行时动态加载和卸载。这意味着程序可以在运行时加载库,并在不需要时将其卸载。这种类型的库通常用于插件系统和模块化编程。

在Linux上创建C++动态共享库需要使用特定的编译器选项和链接器选项。例如,使用g++编译器,可以使用以下命令创建一个名为libexample.so的动态共享库:

代码语言:txt
复制
g++ -shared -o libexample.so example.cpp

在程序中使用动态共享库需要使用dlopen()和dlsym()等函数。例如,以下代码演示了如何加载并使用动态共享库:

代码语言:txt
复制
void *handle;
double (*cosine)(double);
char *error;

handle = dlopen("libexample.so", RTLD_LAZY);
if (!handle) {
    fprintf(stderr, "%s\n", dlerror());
    exit(1);
}

cosine = (double (*)(double)) dlsym(handle, "cosine");
error = dlerror();
if (error != NULL) {
    fprintf(stderr, "%s\n", error);
    exit(1);
}

double result = cosine(3.14159);
printf("The cosine of %f is %f\n", 3.14159, result);
dlclose(handle);

在Linux上使用C++动态共享库可以提高程序的模块化程度,并且可以在运行时动态加载和卸载。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux共享、静态动态详解

1、静态函数,是在程序执行前就加入到目标程序中去了 ; 2、动态函数共享函数是一个东西(在linux共享对象, 文件后缀是.so ,windows动态加载函数, 文件后缀是.dll)...Linux中命名系统中共享规则 2....Linux系统下,DL函数与其他函数在格式没有特殊区别,我们前面提到过,它们创建时候是标准object格式。...在Linux系统,此加载程序名为/lib/ld-linux.so.X(其中X是版本号)。反过来,这个装载器可以找到并加载程序使用所有其他共享。...幸运是,在类Unix系统(包括Linux,您可以同时加载多个版本,所以当有一些磁盘空间损失时,用户仍然可以运行需要旧“旧”程序。

8.9K11

Linux基础——gcc编译、静态动态共享

测试代码目录结构如上图所示,include中存放是头文件,lib中存放是静态(动态,src中存放是源代码,main.c是发布代码。...(共享) 1、动态命名格式 lib + 名字 + .so 例:libMyTest.so (MyTest为动态名字) 2、动态作用分析 共享代码是在可执行程序运行时才载入内存.../app (执行失败,找不到链接,没有给动态链接器(ld-linux.so.2)指定好动态 libmytest.so 路径) 第二种方法: gcc + 源文件 + -I头文件 + libxxx.so...ldd app可以查看当前链接情况 第一种方法: export LD_LIBRARY_PATH=自定义动态路径 (只能起到临时作用,关闭终端后失效) LD_LIBRARY_PATH : 指定查找共享...(动态链接)时除了默认路径之外其他路径,该路径在默认路径之前查找 第二种方法: 将上述命令写入home目录下.bashrc文件中,保存后重启终端生效(永久) 第三种方法: 直接将动态拷贝到user

8.4K40
  • 详解共享动态加载

    在本文中,我将尝试解释在Linux系统中动态加载共享内部工作原理。 这边文章不是一个如何引导,尽管它确实展示了如何编译和调试共享和可执行文件。为了解动态加载内部工作方式进行了优化。...共享在运行时由可执行文件(或其他共享)加载。这让它们变得更加复杂,通常大家对这个领域可能存在认知障碍,我们将在这篇文章中讨论。 示例设置 为了探索共享世界,我们将在本文中使用一个示例。...{ return 4; } Note: 所有示例均在Ubuntu 14.04系统运行 编译共享 在编译实际之前,我们将从random.cpp创建一个目标文件: $ clang++ -...libstdc++: 标准C++ libm: 包含基本数学函数 libgcc_s: GCC(GNU编译器集合)运行时 libc: C:它定义了系统调用和其他基础设施如open,malloc,...基本,它允许您使提升特权可执行文件加载您自己,该将以root用户(或其他用户)身份运行。以root身份运行自己代码几乎可以使您完全控制所使用计算机。

    3.1K20

    翻译 | Linux利用动态链接共享对象提权

    Linux利用动态链接共享对象提权 RPATH和弱文件权限会导致系统损害。...Linux应用程序可以利用动态链接共享对象(我们从现在开始称它们为共享)来提供应用程序功能,而不必重复编写相同代码-有点像Windows应用程序中DLL文件。...就像在WindowsDLL植入攻击一样,Linux共享与弱文件权限相结合,可以用来执行任意代码并危害Linux系统。 操作系统如何查找共享?...运行使用共享应用程序时,操作系统按以下顺序搜索(来自https://linux.die.net/man/1/ld): 任何由rpath-link选项指定目录(由rpath-link选项指定目录仅在链接时有效...在服务器,有一个root用户cronjob恰好执行脆弱二进制文件: ? 在这个例子中,我们将使用metasploit框架来创建一个我们可以在系统植入共享

    2.4K50

    linux两种共享代码方式静态动态

    共享代码 随着软件开发发展,人们发现很多应用代码是相同,也就是说这些代码可以被共享,因此,人们提出了静态动态两种方案来解决代码共享问题。...动态 动态,就是程序应用启动时候,动态加载,因为它一般是在系统运行时候就已经运行动态,因此其它应用可以直接使用它,并且同一个动态可以被多个应用共享使用,在系统中对于一个动态只会存在一份...在linux系统中,动态一般以.so形式命名,表示share object。 很多时候,你很难知道一个应用需要哪些动态,不过我们有个工具ldd可以帮助你查看一个应用需要哪些动态。...动态加载器ld.so 在linux系统中,动态都是通过ld.so来进行管理,它首先会根据应用编译信息查找相对或者绝对路径来查找动态,然后就会通过环境变量LD_LIBRARY_PATH来查找动态...总结 人们为了减少冗余代码,提出了共享概念,在链接时候和程序一同打包成一个可执行文件这个就是静态,反之,在链接时候不将动态打包进可执行文件,只是标记运行需要此共享,这就是动态

    1.2K40

    linux管理共享

    Linux 运行时候,是如何管理共享(*.so)?在 Linux 下面,共享寻找和加载是由 /lib/ld.so 实现。...ld.so 在标准路经(/lib, /usr/lib) 中寻找应用程序用到共享。 但是,如果需要用到共享在非标准路经,ld.so 怎么找到它呢?...ld.so 加载共享时候,会从 ld.so.cache 查找。 传统Linux 先辈 Unix 还有一个环境变量:LD_LIBRARY_PATH 来处理非标准路经共享。...ld.so 加载共享时候,也会查找这个变量所设置路经。 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:....LD_LIBRARY_PATH 这个环境变量是大家最为熟悉,它告诉loader:在哪些目录中可以找到共享。可以设置多个搜索目录,这些目录之间用冒号分隔开。

    3K80

    linux 动态加载_linux默认动态加载路径

    当我们在linux系统引用动态时,经常会遇到一个问题,加入我们需要动态没有在系统默认目录下,我们编译时使用-L指定了动态路径,编译时没有问题,但是执行调用该动态可执行文件时,却提示找不到动态...假设我们使用tensorflow,把需要调用libtensorflow.so和libtensorflow_framework.so两个动态放在我们和我们程序同一级目录下。...,使用ldd命令查看一下: 为什么我们编译时候明明指定了动态路径,而且程序编译时候没有问题,执行时候却找不到了呢?...1、因为我们在编译时候使用-L指定动态路径,只是告诉编译器我们所需要动态在某个目录下,只对编译起作用 2、当程序执行时,程序还是回去系统默认路径下寻找程序运行所需动态 所以在程序运行时候会出现找不到动态问题...解决办法,使用-Wl,-rpath 所需动态路径 告诉程序如果在默认路径下找不到所需动态,则去当前指定路径下找动态

    11.7K20

    Linux下创建自己共享

    本质上来说库是一种可执行代码二进制形式,可以被操作系统载入内存执行。由于windows和linux本质不同,因此二者二进制是不兼容。...Linux操作系统支持函数分为静态动态动态又称共享Linux系统有几个重要目录存放相应函数,如/lib, /usr/lib。 静态函数动态函数 A....B.这类名字一般是libxxx.so,动态又称共享;相对于静态函数动态函数在编译时候并没有被编译进目标代码中,你程序执行到相关函数时才调用函数库里相应函数,因此动态函数所产生可执行文件比较小...由于函数没有被整合进你程序,而是程序运行时动态申请并调用,所以程序运行环境中必须提供相应动态函数改变并不影响你程序,所以动态函数升级比较方便。...对一个做ar s等同于对该做ranlib 动态函数创建 gcc -shared -Wl,-soname,youLibSoname,-o youRealName a.o b.o **linux共享名称分为三段

    2.4K10

    Linux下Qt创建共享与链接共享详解

    本次和大家分享是在Ubuntu下使用Qt生成共享以及在Qt中链接共享方法。 共享是在Linux称呼,在Windows下被称为动态。...之后文章会进行总结说明。 程序平台:Ubuntu14.04、 Qt5.5.1 一、Qt 创建共享 1. 创建类型为Qt工程 ① 新建工程-> Library -> C++ : ?...②类型选择默认共享,填写名称并选择工程路径。简单说下类型分别是动态、静态和Qt插件 ? ③选择默认套件即可 ④选择所需模块,这里我没有勾选任何模块 ?...④生成动态效果 到这里我们就已经生成好了动态,可以看下我们添加动态版本号。 注意,我这里没有区分Debug与Release版本。 ? 二、链接动态 1....由于以前使用共享遇到过上面的问题,但是在刚刚测试共享时候,为什么没有报错呢?是Qt将生成共享放到Linux默认搜索路径下了么?

    5.7K20

    Linux 编译动态_makefile编译动态

    大家好,又见面了,我是你们朋友全栈君。 1. 动态链接简介 动态又叫动态链接,是程序运行时候加载,当动态链接正确安装后,所有的程序都可以使用动态来运行程序。...动态是目标文件集合,目标文件在动态组织方式是按特殊方式组织形成。在动态中函数和变量地址是相对地址而不是绝对地址,其真实地址在调用动态程序加载时形成。...真名是动态链接真实名字,一般总是在别名基础添加一个版本号信息。除此之外还有一个链接名,他是在程序链接时候使用名字。...系统中配置文件/etc/ld.so.conf便是动态链接搜索路径配置文件。在这个文件内存放着可以被Linux共享动态链接所在目录名字(系统默认/lib, /usr/lib除外)。...动态链接管理命令 为了让新增加动态链接能够被系统所共享,我们需要设置运行动态链接管理命令ldconfig。

    6.1K20

    linux中使用boost.python调用c++动态方法

    前言 最近开始使用 robot framework 测试c++动态,robot framework 是跑在 windows 上面,c++动态是跑在远程linux主机上面。...所以现在要解决是如何让python调用c++动态。...python调用c++动态两种办法 在上网查资料和咨询同事之后,得到两种办法:第一种将C++动态封装成C接口,让python调用C语言接口。...python使用extern “C”方式调用c++动态 知道了extern “C”本质之后,我们就按照这个方法进行封装。我是直接拿着c++动态源码,在源码之上封装一层C接口,然后生成动态。...python使用 boost.python 调用c++动态 解决c++动态依赖其他第三方 由于我动态依赖了其他第三方文件,比如openssl,uuid,libevent,pthread

    2.2K71

    linux中使用boost.python调用c++动态办法

    前言 最近开始使用 robot framework 测试c++动态,robot framework 是跑在 windows 上面,c++动态是跑在远程linux主机上面。...所以现在要解决是怎么让python调用c++动态。...python调用c++动态两种办法 在上网查资料和咨询同事之后,得到两种办法:第一种将C++动态封装成C接口,让python调用C语言接口。...python使用extern “C”方式调用c++动态 知道了extern “C”本质之后,我们就按照这个办法进行封装。我是直接拿着c++动态源码,在源码之上封装一层C接口,然后生成动态。...python使用 boost.python 调用c++动态 解决c++动态依赖其他第三方 由于我动态依赖了其他第三方文件,比如openssl,uuid,libevent,pthread

    2.2K30

    Linux 进程间通信 : 共享内存(

    前言 本文主要说明在Linux环境如何使用共享内存。阅读本文可以帮你解决以下问题: 什么是共享内存和为什么要有共享内存? 如何使用mmap进行共享内存? 如何使用XSI共享内存?...Linux系统在编程为我们准备了多种手段共享内存方案。包括: mmap内存共享映射。 XSI共享内存。 POSIX共享内存。 下面我们就来分别介绍一下这三种内存共享方式。...在这主要介绍就是用mmap进行多进程内存共享功能。Linux产生子进程系统调用是fork,根据fork语义以及其实现,我们知道新产生进程在内存地址空间跟父进程是完全一致。...当然这个结果在不同版本Linux可能是不一样,比如在Centos 6环境中mmap共享内存只会记录到buff/cache中。...只有遵循XSI标准实现才能称为UNIX操作系统。 XSI共享内存在Linux底层实现实际跟mmap没有什么本质不同,只是在使用方法上有所区别。

    11.2K33

    Linux静态共享详解及实例

    本质是一个可执行二进制文件,但是它并不能独立执行。...在Linux下分为静态共享(也叫动态),当然Windows下也有静态(.lib)和动态(.dll),这里主要是讲解Linux静态共享,以及它们简单实现。        ...在Linux中静态以.a为后缀,首先静态实现是在文件编译后链接过程中就被载入到了程序中,那么后续程序运行使用就不会再依赖,那么弊端就是将静态载入到程序中会导致程序体积变大,而且如果静态后续进行了更新...这里虽然编译成功了,但是其实还是无法运行test,是因为系统找不到这个共享路径,可以通过ldd test来查看可执行文件动态链接 ?        ...然后通过ldconfig -v来更新系统中动态链接,然后我们就可以发现soname就有动态目录了,而且在lib中也生成了soname软链接文件。 ?

    3.4K21

    linux编译curl动态so

    转载请注明出处:帘卷西风专栏(http://blog.csdn.net/ljxfblog)  curl是一个很强大http开源c++里面能够很方便和http服务器交互。...最近项目开始内测,开始接登录和充值SDK,选择了使用curl来和第三方http服务器交互。...在windows下还是很容易使用,如何使用案例比比皆是,而且很容易就找到已经编译好动态进行测试,但是最后在linux下部署时候,发现不好找已经编译好so文件,最后没办法只好自理更生。...我是使用腾讯SDK里面附带curl源码(ps,腾讯SDK示例代码貌似没在linux测试过,我编译后使用他们代码,发现很容易崩溃,需要修改才能运行,但是windows正常)。...包含了编译生产、头文件等。 然后为了能够方便移植我们程序,把include/lib下面的头文件和so文件拷贝到自己工程目录就能使用curl了。

    6.4K10

    C++动态和静态_动态和静态调用方法

    1、前言 从事软件工作也有两年了,C++静态动态也用了不少,但都是依葫芦画瓢,一直没具体去研究一下二者区别,加载方式等,今天花时间看了几篇博客,重新学习了一下,做出如下笔记。...2、定义 静态动态从字面意思来看,区别就是静态和动态。而这里静态和动态指的是链接阶段。可以看如下编译过程。 静态:在链接阶段将会与目标汇编后目标文件.o一起打包生成可执行文件。...3、 升级不方便,升级必须重新编译 动态 1、 动态可以实现进程之间资源共享,有一份就行 2、 升级程序简单,不需要重新编译 1、 运行期间在加载,将会减慢代码执行速度 2、 增加程序依赖项,必须跟着可执行文件一起...4、文件形式 Tables Windows Linux 静态 .lib Libxxx.a 动态 .dll与.lib libxxx.so 5、生成和加载方式 这里我仅讨论windows下使用vs...这里.lib本质不同于静态.lib。这里.lib一般是一些索引信息,记录了dll中函数入口和位置,dll中是函数具体实现。而静态lib包含了索引和实现。

    3.1K20

    Linux静态动态

    由于windows和linux本质不同,因此二者二进制是不兼容。本文仅限于介绍linux。 2.种类 linux有两种:静态共享动态)。...共享好处是,不同应用程序如果调用相同,那么在内存里只需要有一份该共享实例。...动态后缀是.so,它由gcc加特定参数编译产生。...在linux下,文件一般放在/usr/lib /lib下, 静态名字一般为libxxxx.a,其中xxxx是该lib名称 动态名字一般为libxxxx.so.major.minor,xxxx...和ld-linux 7.可执行程序在执行时候如何定位共享文件 当系统加载可执行代码时候,能够知道其所依赖名字,但是还需要知道绝对路径 此时就需要系统动态载入器(dynamic linker

    9010
    领券