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

linux g 编译动态库

Linux GCC 编译动态库基础概念及应用

基础概念

动态库(Dynamic Link Library),也称为共享库(Shared Library),是一种在程序运行时被加载到内存中的库文件。与静态库不同,动态库允许多个程序共享同一份库代码,从而节省内存空间并提高库的更新效率。

优势

  1. 节省内存:多个程序可以共享同一份动态库,减少内存占用。
  2. 易于更新:只需替换库文件,无需重新编译所有依赖该库的程序。
  3. 灵活性:可以在运行时动态加载和卸载库。

类型

常见的动态库格式包括:

  • .so(在Linux系统中)
  • .dll(在Windows系统中)

应用场景

动态库广泛应用于各种系统和应用程序中,特别是在需要频繁更新或共享代码的场景下,如操作系统内核、大型软件框架、插件系统等。

编译动态库的步骤

假设我们有一个简单的C语言源文件 example.c,我们希望将其编译成一个动态库 libexample.so

示例代码

example.c

代码语言:txt
复制
#include <stdio.h>

void hello() {
    printf("Hello, World!\n");
}

编译步骤

  1. 编译源文件为对象文件
  2. 编译源文件为对象文件
  3. -c 表示只编译不链接,-fPIC 表示生成位置无关代码(Position Independent Code),这是动态库所必需的。
  4. 将对象文件打包成动态库
  5. 将对象文件打包成动态库
  6. -shared 表示生成共享库。

使用动态库

假设我们有一个主程序 main.c 需要使用这个动态库。

main.c

代码语言:txt
复制
#include <stdio.h>

void hello();  // 声明外部函数

int main() {
    hello();
    return 0;
}

编译并运行主程序:

代码语言:txt
复制
gcc -L. -lexample main.c -o main
./main

-L. 表示在当前目录下查找库文件,-lexample 表示链接 libexample.so 库。

常见问题及解决方法

问题1:找不到动态库

原因:系统无法找到动态库文件。

解决方法

  • 确保库文件存在于指定的路径中。
  • 设置 LD_LIBRARY_PATH 环境变量,包含库文件所在的目录。
  • 设置 LD_LIBRARY_PATH 环境变量,包含库文件所在的目录。

问题2:链接错误

原因:编译时未正确指定库文件或库文件不存在。

解决方法

  • 检查 -L-l 参数是否正确。
  • 确保库文件已正确生成且路径无误。

问题3:运行时错误

原因:动态库版本不匹配或依赖的其他库缺失。

解决方法

  • 使用 ldd 工具检查程序的依赖库是否完整。
  • 使用 ldd 工具检查程序的依赖库是否完整。
  • 确保所有依赖库都已正确安装并位于系统库路径中。

通过以上步骤和方法,可以有效编译和使用Linux下的动态库,并解决常见的相关问题。

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

相关·内容

  • Linux 编译动态库_makefile编译动态库

    生成动态链接库 生成动态链接库的命令比较简单: 2.1 使用-shared 告诉编译器生成一个动态链接库 2.2 使用选项-fPIC或者-fpic,使得生成的代码与位置无关 gcc -shared -Wl...系统中的配置文件/etc/ld.so.conf便是动态链接库的搜索路径配置文件。在这个文件内存放着可以被Linux共享的动态链接库所在目录的名字(系统默认的/lib, /usr/lib除外)。...使用动态链接库 在编译程序的时候,使用动态链接库和静态链接库是一致的, 使用“-l库名”的形式,编译器在生成可执行文件的时候会链接该链接库文件。..../ -lstr -L : 指定链接动态库的路径 -lstr : 制定链接的动态库名称 这里需要注意的是: 编译的链接动态库和运行的动态链接库并不一致。...思路如下: 在某个特定目录放不同模块编译生成的动态库; 程序中遍历该目录下所有的符合条件的动态库,然后打开动态库获取相关函数(例如module_init()),一般为模块的注册或者初始化函数,完成相应模块的加载或初始化操作

    6.2K20

    linux编译curl库的动态库so

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

    6.5K10

    Linux基础——gcc编译、静态库与动态库(共享库)

    gcc编译器 1、gcc工作流程 2、gcc常用参数 参数 用途 -v 查看版本 -o 产生目标文件 -I+目录 指定头文件目录 -D 编译时定义宏 -00/-01/-03 没有优化/缺省值.../优化级别最高 -Wall 提示更多警告信息 -c 只编译子程序 -E 生成预处理文件 -g 包含调试信息 静态库 1、静态库的命名格式 lib + 库的名字 + .a 例:libMyTest.a...,在编译过程中仅简单的引用,因此代码体积较小。...优点: 节省内存 易于更新,不用重新编译可执行程序,运行时自动加载 缺点: 延时绑定,速度略慢 3、动态库的制作与使用 测试代码的目录结构与静态库相同。.../app (执行失败,找不到链接库,没有给动态链接器(ld-linux.so.2)指定好动态库 libmytest.so 的路径) 第二种方法: gcc + 源文件 + -I头文件 + libxxx.so

    8.7K40

    Linux下关于动态库的说明 | 编译以及调用

    动态库是一种在已经编译完毕的程序开始启动运行时,才被加载来调用其中函数的库。其加载方式与静态库截然不同。...---- 动态库的命名 ​ Linux下,动态库通常以.so(shareobject)结尾。...即,程序与静态库编译链接后,即使删除静态库文件,程序也可正常执行。 ​ 动态库正好相反,在编译链接时,没有把库文件的代码加入到可执行文件中,所以生成的文件较小,但运行时,仍需要加载库文件。...+命令编译生成libdemo.so动态库文件 ➜ g++ demo_say.cpp demo_print.cpp -fPIC -shared -o libdemo.so # 查看一下文件,如意生成一个...源码 # 先将生成的libdemo.so文件放进系统默认的依赖库目录中 ➜ sudo cp libdemo.so /usr/lib # 编译 ➜ g++ test.cpp -L/usr/lib

    2.2K40

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

    当我们在linux系统引用动态库时,经常会遇到一个问题,加入我们需要的动态库没有在系统的默认目录下,我们编译时使用-L指定了动态库的路径,编译时没有问题,但是执行调用该动态库的可执行文件时,却提示找不到动态库...: 可见程序编译没有问题,但是当执行可执行程序时,出现如下结果: 程序提示加载动态库失败,使用ldd命令查看一下: 为什么我们编译的时候明明指定了动态库的路径,而且程序编译的时候没有问题,执行的时候却找不到了呢...1、因为我们在编译的时候使用-L指定动态库的路径,只是告诉编译器我们所需要的动态库在某个目录下,只对编译起作用 2、当程序执行时,程序还是回去系统的默认路径下寻找程序运行所需的动态库 所以在程序运行的时候会出现找不到动态库的问题...解决办法,使用-Wl,-rpath 所需动态库的路径 告诉程序如果在默认路径下找不到所需动态库,则去当前指定的路径下找动态库。...修改gcc编译指令后,结果如下: 可见,动态库加载成功,程序运行成功,问题解决。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    11.8K20

    Linux系统下编译FFmpeg生成arm平台下动态连接库

    FFmpeg为开源音视频编解码库,市面上的播放器很多都是基于FFmpeg开发的,可以说学会了FFmpeg,音视频开发的所有功能都可以实现。...FFmpeg使用c语言编写,makefile工具编译,因此选择在linux平台下编译。...而我们需要生成arm平台下的so库,需要使用到ndk 1.ndk下载和安装 https://developer.android.google.cn/ndk/downloads/ 在安卓开发官网可以下载到...,可以直接在linux中下载,也可以在windows平台下载后传到linux下,我这边使用的是14b版的ndk 2.首先下载FFmpeg 在linux中使用命令: wget http://ffmpeg.org.../build_android.sh 等待编译完成: ? 将该文件夹拷贝到windows下: ? lib中存放的是so库,include中存放的是头文件。

    2.9K20

    rust 开发编译 Android 动态库实践

    目前国内也已经有一些团队在用 rust 进行开发了,可以在观望一波后,再决定是否投入精力入坑~~~ ---- rust 编译 so 实践 下面是用 rust 编译 Android 动态库实践,主要参考了...{ version = "0.10.2", default-features = false } 4 5[profile.release] 6lto = true 7 8[lib] 9# 编译的动态库名字...10name = "rust" 11# 编译类型 cdylib 指定为动态库 12crate-type = ["cdylib"] 关于添加的内容含义如上注释,主要是添加了 jni 依赖和指定编译,有了...jni 依赖才能够让 Android 项目代码调用到 so 动态库的内容。...这样就完成了用 rust 编译 Android 平台的 so 动态库,并且每次编译后的时候就要进行 so 的替换,当然也可以想办法把 rust so 的编译放在 Android gradle 的编译过程中

    3.6K10

    【Linux】静态库和动态库

    Linux为什么不允许普通用户给目录建立硬链接呢? 系统层面上有.和…硬链接指向目录。...一、动态库和静态库 具体的动态库和静态库的相关内容点击跳转 Linux的库一般分为动态库和静态库: 静态库(.a):库文件以.a为后缀,程序在编译链接的时候把库的代码链接到可执行文件中。...链接的本质:无非就是我们调用库函数的时候和标准库是如何关联的问题 库的名称:去掉前缀lib去掉后缀.so/.a剩下的就是库名称,比如libc.so就是C库 gcc 在编译时默认使用动态链接,而生成静态链接...也就是说,一定要告知路径下哪一个库,即使只有一个库,也要明确告知gcc要链接哪一个库(虽然我们以前写代码的时候,从来没有指明过库名称,这是因为gcc/g++默认帮我们填了,可以识别C/C++自带的库。...---- 四、制作动态库 首先我们需要把库文件全部编译成.o文件,这里与静态库不同,需要带上选项 -fPIC,形成与位置无关码: gcc -c -fPIC my_add.c 什么是与位置的无关码的目标二进制文件

    32130

    【Linux】静态库和动态库

    动静态库 一、静态库 1. 静态库概念 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。 2....如: 如上图,为什么我们在编译的时候没有编译头文件呢?因为头文件在当前路径下,所以编译器 gcc 是可以直接找到的!...如果我们将头文件和库文件都安装到系统中了,-I 和 -L 就不需要带了。 二、动态库 1. 动态库概念 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。 2....而我们在上面将路径和库名称都告诉了编译器,但是程序已经形成了,编译器的工作周期已经结束了,接下来运行的时候,和编译器就没有关系了!...首先我们要知道,在 Linux 下,形成的可执行程序是 ELF 格式的可执行程序,它其中包含有一张类似于符号表的东西,里面包含各种函数依赖的库以及地址,符号表就是动态链接这些动态库的。

    74410

    C编译: 动态连接库 (.so文件)

    UNIX下,共享库以so为后缀(shared object)。共享库与Windows下的DLL类似,是在程序运行时动态连接。多个进程可以连接同一个共享库。 ?...共享库要求有此选项,以便实现动态连接(dynamic linking)。 生成共享库: $gcc -shared -o libmystack.so mystack.o 库文件以lib开始。...>,编译器会在默认include搜索路径中寻找。 编译器还需要知道我们用了哪个库文件,在gcc中: 使用-l选项说明库文件的名字。.../test 执行程序 运行程序 尽管我们成功编译了test可执行文件,但很有可能不能执行。一个可能是权限问题。我们需要有执行该文件的权限,见Linux文件管理背景知识 另一个情况是: ....这样做的坏处是,如果库文件移动位置,我们需要重新编译test。使用如下命令编译test.c: $gcc -g -o test test.c -lmystack -L. -Wl,-rpath=.

    2.8K70
    领券