Linux动态库

linux,动态 · 浏览次数 : 17

小编点评

**制作动态库 (共享库)** **编写源代码:** - 将代码拆分成多个文件,每个文件对应一个模块或功能。 - 使用 `#include` 或 `include` 语句包含头文件。 - 使用 `return` 语句控制流程。 **编译源代码:** - 使用 `gcc` 编译源代码,并指定 `-c` 参数编译目标文件。 - 使用 `-fpic`标志生成位置无关代码。 - 使用 `-shared` 参数生成共享库。 **设置库路径:** - 可选择将生成的动态库所在目录添加到系统路径。 - 使用 `LD_LIBRARY_PATH` 环境变量设置路径。 **使用动态库:** - 在其他程序中使用动态库,使用 `-L` 或 `-l` 参数指定库文件路径。 - 使用 `-o` 参数指定输出文件名。 **示例:** ```c // shared_library.c void my_function() { // 库函数代码 } // main.c #include #include "shared_library.h" int main() { my_function(); return 0; } ``` **编译和链接:** ```bash gcc -c -fpic shared_library.c gcc -shared -o libexample.so shared_library.o ``` **运行动态库:** ```bash gcc -o my_program my_program.c -lexample -L/path/to/library/ -lexample ``` **注意:** - `-L` 参数指定库文件搜索路径。 - `-l` 参数指定动态库文件名。 - `-o` 参数指定输出文件名。 - `-shared` 参数生成共享库。

正文

制作动态库(也称为共享库)是将可重用的代码和函数打包成单独的库,可以在多个程序中共享使用。在Linux上制作动态库涉及以下步骤:

  1. 编写源代码
    编写你的代码,并确保它们可以编译为动态库。通常,你需要将代码拆分成多个文件,每个文件对应一个模块或功能。

  2. 编译源代码
    使用合适的编译器(如gcc)将源代码编译成目标文件(.o 文件)。

    gcc -c -fpic source1.c source2.c
    

    -c 选项表示编译成目标文件,-fpic 表示生成位置无关代码,这是动态库需要的。

  3. 链接为动态库
    将目标文件链接成动态库。

    gcc -shared -o libexample.so source1.o source2.o
    

    -shared 选项表示生成共享库,-o 用于指定输出文件名。

  4. 设置库路径(可选):
    将生成的动态库所在目录添加到系统的库路径中,以便系统能够找到该动态库。

    export LD_LIBRARY_PATH=/path/to/directory/containing/library:$LD_LIBRARY_PATH
    

    或者将库文件复制到系统标准库目录,如 /usr/lib/usr/local/lib

  5. 使用动态库
    在其他程序中使用动态库,你需要在编译和链接时指定动态库。

    gcc -o my_program my_program.c -lexample -L/path/to/directory/containing/library
    

    -lexample 表示链接 libexample.so-L 用于指定动态库所在目录。

gcc编译的各类参数详解

1. 常用基本参数

  • -c: 编译源文件但不进行链接,生成目标文件。
  • -o <output>: 指定输出文件名,可以是可执行文件、目标文件等。
  • -E: 只运行预处理器,生成预处理后的代码。
  • -S: 只进行编译,生成汇编代码。

2. 选项控制编译和优化

  • -O<level>: 控制优化级别。可选的级别有 -O0(无优化), -O1(基本优化), -O2(更多优化), -O3(全部优化)。
  • -Wall: 打开所有警告选项。
  • -Werror: 将警告视为错误。
  • -std=<standard>: 指定使用的编程语言标准,如 -std=c99
  • -pedantic: 遵循严格的标准。

3. 头文件和库路径

  • -I<path>: 指定头文件的搜索路径。
  • -L<path>: 指定库文件的搜索路径。

4. 链接参数

  • -l<library>: 链接指定的库,例如 -lm 链接数学库。
  • -static: 静态链接,将所有库链接到可执行文件中。
  • -shared: 生成共享库。

5. 调试信息和符号表

  • -g: 生成调试信息,以便在调试时使用。
  • -ggdb: 生成更详细的调试信息,适用于使用 GDB 进行调试。

6. 多线程和并行编译

  • -pthread: 指定支持多线程编程,链接时需要使用。
  • -j<num>: 并行编译,可以加速编译过程。

7. 其他常用选项

  • -D<macro>: 定义宏,可以通过 -D<macro>-D<macro>=value 来定义宏。
  • -U<macro>: 取消宏定义。
  • -include <file>: 在预处理之前包含指定的文件。

与Linux动态库相似的内容:

Linux动态库

制作动态库(也称为共享库)是将可重用的代码和函数打包成单独的库,可以在多个程序中共享使用。在Linux上制作动态库涉及以下步骤: 编写源代码: 编写你的代码,并确保它们可以编译为动态库。通常,你需要将代码拆分成多个文件,每个文件对应一个模块或功能。 编译源代码: 使用合适的编译器(如gcc)将源代码

[转帖]指定运行时动态库位置的三种方式

https://blog.csdn.net/gx_1983/article/details/78352457 指定运行时动态库位置的三种方式 在Linux 中,动态库的搜索路径除了默认的搜索路径外,还可通过三种方法来指定:方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径;方法二:

QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇

Qt具有跨平台的特性,即Qt数据结构与算法库本身跨平台和编译脚本(.pro)跨平台。在同时具有Windows下和Linux开发的需求时,最好的建议是使用QtCreator来开发,虽然也可以使用其他的IDE配合CMake等方式,但使用QtCreator更加方便,并且操作环境完全一致。QtCreator

[转帖]ldconfig命令

https://linux265.com/course/linux-command-ldconfig.html ldconfig命令的作用主要是在默认搜寻目录/lib和/usr/lib以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库,进而创建出动态装入程序(l

[转帖]Linux后门的几种姿势

转载自 https://evilanne.github.io/2017/08/26/Linux后门-持续关注/ 在一次渗透中,成功获取某目标几台比较重要的机器,当时只想着获取脱库,结果动静太大被发现了,之前渗透并没太在意Linux后门,经过此次事后从Google找各种资料,一款满意的rootkit都

[转帖]初探Linux CPU动态调频与实测

https://zhuanlan.zhihu.com/p/33753019 关于 本文主要涉及Linux CPUFreq子系统是什么,为什么需要,怎么用。 并解决在实际测试中遇到的三个问题: scaling_governor没有userspace的问题。 /proc/cpuinfo与cpuinfo_

[转帖]Linux命令拾遗-动态追踪工具

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介# 这是Linux命令拾遗系列的第六篇,本篇主要介绍工作中常用的动态追踪工具strace、arthas、bpftrace等。 本系列文章索引Linux命令拾遗-入门篇Linux命令拾遗-文本处理篇Linux命令拾遗-

[转帖]《Linux性能优化实战》笔记(24)—— 动态追踪 DTrace

使用 perf 对系统内核线程进行分析时,内核线程依然还在正常运行中,所以这种方法也被称为动态追踪技术。动态追踪技术通过探针机制来采集内核或者应用程序的运行信息,从而可以不用修改内核和应用程序的代码就获得丰富的信息,帮你分析、定位想要排查的问题。 以往,在排查和调试性能问题时,我们往往需要先为应用程

[转帖]linux【监控】BCC – 用于Linux性能监视,网络和更多的动态跟踪工具

https://blog.51cto.com/ghostwritten/5344917 文章目录​ ​1. ubuntu安装bcc​​​ ​2. centos安装bcc​​​ ​3. cachestat 缓存统计​​​ ​4. cachetop 缓存命中​​​ ​5. filtop 跟踪内核中文件的

[转帖]线上环境 Linux 系统调用追踪

线上环境 Linux 系统调用追踪 PingCAP 提到如何动态追踪进程中的系统调用,相信大家第一时间都能想到 strace,它的基本用法非常简单,非常适合用来解决 “为什么这个软件无法在这台机器上运行?” 这类问题。但如果需要分析线上服务 (特别是延迟敏感型)的某些系统调用的延迟时,strace