动态库

gcc 生成 .a静态库和 .so动态库

只愿长相守 提交于 2019-12-24 01:05:46
我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两 种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态 库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运 行时还需要动态库存在。本文主要通过举例来说明在Linux中如何创建静态库和动态库,以 及使用它们。 在创建函数库前,我们先来准备举例用的源程序,并将函数库的源程序编译成.o文件。 第1步:编辑得到举例的程序--hello.h、hello.c和main.c; hello.c(见程序2)是函数库的源程序,其中包含公用函数hello,该函数将在屏幕上输出" Hello XXX!"。hello.h(见程序1)为该函数库的头文件。main.c(见程序3)为测试库文件的 主程序,在主程序中调用了公用函数hello。 程序1: hello.h #ifndef HELLO_H #define HELLO_H void hello(const char *name); #endif //HELLO_H 程序2: hello.c #include <stdio.h> void hello(const char *name) { printf("Hello %s!\n", name); } 程序3: main.c #include "hello.h" int main

CMake--静态库与动态库构建

安稳与你 提交于 2019-12-23 17:49:23
小结内容 建立一个静态库和动态库,提供 HelloFunc 函数供其他程序编程使用, HelloFunc 向终端输出Hello World 字符串。 安装头文件与共享库。 1.代码与CMakeList.txt文件编写 首先建立 t3 目录,用于存放本节涉及到的工程 t3目录下创建lib目录用来存代码 在 t3 目录下建立 CMakeLists.txt , PROJECT(HELLOLIB) ADD_SUBDIRECTORY(lib) #SET(LIBRARY_OUTPUT_PATH < 路径 >) #指定库的生成位置。 在 lib 目录下建立两个源文件 hello.c 与 hello.h hello.c 内容如下: #include "hello.h" void HelloFunc() { printf("Hello Worldn"); } hello.h 内容如下: #ifndef HELLO_H #define HELLO_H #include <stdio.h> void HelloFunc(); #endif 在 lib 目录下建立 CMakeLists.tx SET(LIBHELLO_SRC hello.c) ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) #添加动态库 #ADD_LIBRARY(hello STATIC $

Delphi调用DLL出现错误:Invalid pointer operation

空扰寡人 提交于 2019-12-22 08:42:29
DLL中的函数返回string类型,在Delphi中动态调用时可以得到正确结果,在关闭程序是提示错误:Invalid pointer operation 在网上搜索了一圈,均指向内存泄露,以及下面的解决方法:   Windows中如果一个动态库导出函数以参数形式传递或者返回了一个长字符串或者 动态数组(无论是直接传递还是包含在一个对象中),那么动态库以及其调用程序都必须得引用ShareMem单元。同样,如果程序或者库通过New或者 GetMem申请了内存,并且该内存在另一个模块中通过Dispose或FreeMem释放,也得这么做。务必把ShareMem放在程序或者库所有引用 单元之首。   ShareMem是BORLANDMM.dll内存管理单元接口,它允许模块间共享动态申请内存。BORLANDMM.dll必须与使用了改单元的程序或者Dll一块儿部署。当程序或者动态库使用了ShareMem,其内存管理将会由BORLANDMM.dll接管。 注意:在dpr文件的uses语句的开头加上ShareMem,以及DLL中的uses语句开头加上ShareMem。 来源: https://www.cnblogs.com/fred-rk/archive/2012/12/16/2820836.html

c++动态库静态库

天大地大妈咪最大 提交于 2019-12-19 02:36:25
动态库编译程序只加载连接符号,运行程序时通过符号加载对应库文件函数。 静态库编译程序连接符号和函数体同时打包到一起,运行程序时也是通过符号进行加载函数体。 共同点:内存启动原理是现用现开辟;并且跟随类创建自己独立运行内存空间;类似多个子类同时创建对象,那么基类内存空间都是独立的一样。重点静态库不代表静态(static);动态库和静态库只是程序部署的一种解决方案。 不同点:动态库是把整体进行分化,有主文件和库文件;静态库是一个整体文件,无论是动态库还是静态库都是程序设计和代码复用的一种模式; 熟知用之。下图对比,4个对象调用同一函数变量的内存并不是同一区域。 来源: CSDN 作者: ma_zhao_shuai 链接: https://blog.csdn.net/weixin_41913666/article/details/103595208

[linux]中error while loading shared libaries

孤者浪人 提交于 2019-12-18 21:44:26
前言:Linux下默认情况,编译器只会使用/lib和/usr/lib这两个目录下的库文件,通常通过源码包进行安装时,如果不指定–prefix,会将库安装在/usr/local/lib目录下;当运行程序需要链接动态库时,提示找不到相关的.so库,会报错。因此/usr/local/lib目录不在系统默认的库搜索目录中。 首先打开/etc/ld.so.conf文件 vim /etc/ld.so.conf 加入动态库文件所在的目录:执行vi /etc/ld.so.conf,在"include ld.so.conf.d/*.conf"下方增加"/usr/local/lib"。如上图所示 保存后,在命令行终端执行:/sbin/ldconfig -v;其作用是将文件/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache以供使用,因此当安装完一些库文件,或者修改/etc/ld.so.conf增加了库的新搜索路径,需要运行一下ldconfig,使所有的库文件都被缓存到文件/etc/ld.so.cache中,如果没做,可能会找不到刚安装的库。 经过以上三个步骤,成功解决问题。 如果运行应用程序时,还是提示以上错误,那就得确认一下是不是当前用户在库目录下是不是没有可读的权限。像我遇到的问题就是,从别的机子拷贝了一些.so动态库,然后用root权限放到了/usr

LINUX下动态链接库的使用(dlopen/dlsym/dlclose/dlerror)

走远了吗. 提交于 2019-12-18 00:31:53
dlopen 功能:打开一个 动态链接库 包含头文件: #include <dlfcn.h> 函数定义: void * dlopen( const char * pathname, int mode ); 函数描述: 在dlopen的()函数以指定模式打开指定的动态连接库文件,并返回一个 句柄 给调用进程。使用dlclose()来卸载打开的库。 mode:    RTLD_LAZY 暂缓决定,等有需要时再解出符号    RTLD_NOW 立即决定,返回前解除所有未决定的符号。   RTLD_LOCAL   RTLD_GLOBAL 允许导出符号   RTLD_GROUP   RTLD_WORLD 返回值:    打开错误返回NULL   成功,返回库引用 编译时候要加入 -ldl (指定dl库)    例如   gcc test.c -o test -ldl   dlopen()是一个强大的 库函数 。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。比如 Apache Web 服务器利用这个函数在运行过程中加载模块,这为它提供了额外的能力。一个配置文件控制了加载模块的过程。这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了。   可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定义,并在

当Swoole遇上PHP

橙三吉。 提交于 2019-12-17 00:41:52
Swoole涉及的知识点非常多,互为表里,每次想写都发现根本理不出一个头绪 Swoole是一个php的扩展,它的核心目的就是解决php在实现server服务中可能遇到的一系列问题,这些问题用源生的php往往并不能很高效(执行效率)的解决,一般也不会使用php来解决,所以会有说swolle重新定义的php的说法。 毕竟php作为一门成熟的脚本语言,开发效率是先天优势。 扩展的英文名称是Extension,php扩展是用C语言作为开发语言,基于Zend引擎提供的API,编译成的一个动态库。 如果曾经做过类似动态库调用开发的童鞋可能会更好理解一些,例如Android中的NDK开发 在php的配置文件中配置好extension的属性后,就可以引用这个动态库了。 也就是说,swoole本身是用C语言编写的,它可以让php获得一些额外的function。 然后是运行方式,swoole的许多功能都只能运行在cli模式下,而cli模式往往是很多刚接触swoole的phper遇到的第一个问题。 我当初学习swoole的时候也在cli这里栽了个大跟头 我的官方群 点击此处 。 我们现在整理一下最常见的php代码执行方式: 安装apache、php 配置apache对那个目录进行php解析 用浏览器访问那个目录的php文件 更多的细节这里就不提了,毕竟我相信每个phper对这个都是很熟悉的。

vs动态库调试

隐身守侯 提交于 2019-12-16 22:18:47
在动态库工程中设置如下 然后直接运行动态库就可以了 如果发现运行动态库出现无效的断点了 那么就是因为动态库的代码有了新的改动,导致exe使用的动态库和代码不一致引起的 解决方法: 重新生成动态库,重新编译使用动态库的exe工程,这样应用程序使用的动态库就和动态库的代码一致了嘛,就不会有无效的断点了 来源: CSDN 作者: 飞天_ 链接: https://blog.csdn.net/qq_36769722/article/details/103570106

Linux系统添加动态库文件

空扰寡人 提交于 2019-12-16 03:46:51
库文件分为静态库文件和动态库文件。一般Linux系统把/lib和/usr/lib两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要我在设置就可以直接使用。但是在我们做项目时,有一些库需要我们自己加入,今天就来说一下自己加入库的一些方法。 1.方法一 在 /etc/ld.so.conf 文件中添加库的搜索路径。 执行命令如下: vim /etc/ld.so.conf 在include /etc/ld.so.conf.d/*.conf下加入你的动态库的路径即可。 默认Linux下ld.so.conf 这个文件是只读权限,因此就需要更改文件权限,使用chmod命令。 修改完以后是不能直接使用的,需要执行ldconfig(需要root权限)命令才能使用。 方法二 要在 Linux 系统中添加库路径,我们很容易想到环境变量 LD_LIBRARY_PATH 。这种设置方式很简单,也不需要 root 权限,命令格式如下: $ export LD_LIBRARY_PATH = < your - lib - path > : $LD_LIBRARY_PATH 例子如下: $ export LD_LIBRARY_PATH = / home / test / lib : $LD_LIBRARY_PATH # LD_LIBRAY_PATH 查看是否设置成功 echo $LD_LIBRARY

QT5 -- 基础知识-2

两盒软妹~` 提交于 2019-12-14 22:19:55
http://c.biancheng.net/view/3871.html Dynamic Link 和 Static Link Dynamic Link 即动态链接,Static Link 即静态链接。 动态链接库 目标程序通常都不是独立个体,生成程序时都需要链接其他的库,要用到其他库的代码。对于多个程序同时运行而言,内存中就可能有同一个库的多个副本,占用了太多内存而干的活差不多。 为了优化内存运用效率,引入了动态链接库(Dynamic Link Library),或叫共享库(Shared Object)。使用动态链接库时,内存中只需要一份该库文件,其他程序要使用该库文件时,只要链接过来就行了。由于动态库文件外置,链接到动态库的目标程序相对比较小,因为剥离了大量库代码,而只需要一些链接指针。 使用动态库,也意味着程序需要链接到如 *.dll 或 *.so 文件,得提前装好动态库文件,然后目标程序才能正常运行。 静态链接库 静态库就是将链接库的代码和自己编写的代码都编译链接到一块,链接到静态库的程序通常比较大,但好处是运行时依赖的库文件很少,因为目标程序自己内部集成了很多库代码。 库文件后缀 Linux /Unix 系统里静态库扩展名一般是 .a,动态库扩展名一般是 .so 。Windows 系统里 VC 编译器用的静态库扩展名一般是 .lib,动态库扩展名一般是 .dll 。