首页 > 系统相关 >找到一个linux静态库动态库的好资料.1

找到一个linux静态库动态库的好资料.1

时间:2024-12-24 19:57:32浏览次数:6  
标签:gcc 动态 静态 HOWTO libhello so.0 func linux main

# 正文

前一篇说找到了这个资料:
https://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html;
它的首页是https://tldp.org/HOWTO/Program-Library-HOWTO/index.html。
原文很好懂,所以我这里算是写一下自己学到的东西,不是翻译,也不按顺序,先整理一下静态库、共享库以及动态库的最简单例子,因为觉得有人会喜欢看一下这个然后自己研究。

静态库示例

编一个静态库的代码libhello.c:

编译静态库libhello-static.a:
- gcc -Wall -g -c -o libhello-static.o libhello.c
- ar rcs libhello-static.a libhello-static.o

写一个使用hello()函数的main.c:

编译main.c,得到可执行程序main,命令:
- gcc -Wall -g -c main.c -o main.o
- gcc -g -o main main.o -L ./ -lhello-static


共享库示例

库的代码还是用libhello.c,不过这次多打印一个换行:

编译共享库libhello.so,命令:
- gcc -fPIC -Wall -g -c libhello.c
- gcc -g -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0 libhello.o -lc

原文这里提到过因为libhello依赖C library,所以使用了-lc选项;实际上不使用好像也没问题,大概因为原文是2003年的文档,后来新版的gcc不需要这个了,这不是重点,验证过程放到endnote1,继续。

现在把libhello.so.0.0挪到/usr/local/lib/,并使用ldconfig创建共享库缓存:

可以看到ldconfig创建了一个名为/usr/local/lib/libhello.so.0的符号连接。


现在我们手动创建一个名为 libhello.so的软连接:ln -sf libhello.so.0 libhello.so

 

然后使用共享库编译可执行程程序main:
- gcc -Wall -g -c main.c -o main.o
- gcc -g -o main main.o -L /usr/local/lib -lhello


执行一下试试:

PS: 这里编译得到的可执行程序main的过程中就没有像上一篇那样的现象了(endnote2)

动态库示例

编写一个使用动态库的main.c:

代码贴到endnote3了。

部署/root/d/libhello.so.0.0,就是把上一步得到的共享库拷贝过来了事:

编译可执行程序main:
- gcc -Wall -g -c main.c
- gcc -g -o main main.o -ldl

注意,这里不需要告诉gcc去哪里查找libhello.so.0.0,因为只有执行的时候才加载libhello.so.0.0,但是需要使用gcc的-ldl选项以包含加载动态库的那些库。

文章好像有点简单,好在原文清晰又详细,贴一下连接,文章算欧了:
https://tldp.org/HOWTO/Program-Library-HOWTO/more-examples.html

# ENDNOTES

endnote1

不使用-lc选项,编一下libhello.so.0.0

使用ldconfig创建动态库缓存:

编译可执行程序main,ldd查看一下它依赖的共享库:

执行一下,发现也符合期望:

 endnote2

就是这个现象:

endnote3

#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
typedef void (*ddl_demo_func)(void); 
int main(void){
    const char *error;
    void *module;
    ddl_demo_func demo_func;    //变量demo_func是一个指向函数的指针
    module = dlopen("/root/d/libhello.so.0.0", RTLD_LAZY);
    if(!module){
        fprintf(stderr, "could not open libhello.so.0.0: %s\n", dlerror());
        exit(1);
    }

    dlerror();
    demo_func = dlsym(module, "hello");
    if ((error = dlerror())){
        fprintf(stderr, "could not find hello: %s\n", error);
        exit(1);
    }

    (*demo_func)();     //调用函数hello()
    dlclose(module);
    return 0;
}

标签:gcc,动态,静态,HOWTO,libhello,so.0,func,linux,main
From: https://blog.csdn.net/weixin_42988262/article/details/144699416

相关文章

  • 嵌入式linux驱动框架 I2C系统驱动程序模型分析
    引言:在嵌入式Linux系统中,I2C(Inter-IntegratedCircuit)是一种常用的通信协议,用于连接低速设备(如传感器、显示器、存储器等)与主控制器。I2C系统驱动程序模型通过层次化的设计,使得I2C总线设备和驱动程序能够高效、灵活地进行通信和管理。本分析旨在详细介绍I2C驱动程序框......
  • RK3568平台开发系列讲解(中断及异常篇)Linux 中断系统中的重要数据结构
    ......
  • FTP(linux版)
    简述:linux版权限可能会不容易理解,可参考windwos做为基础。一、FTP(linux版)1.ftp详解简介:vsftpd是“verysecureFTPdaemon”的缩写,安全性是它的一个最大的特点。vsftpd是一个UNIX类操作系统上运行的服务器的名字,它可以运行在诸如Linux、BSD、Solaris、HP-UNIX等系统......
  • 启用Linux防火墙日志记录和分析功能
    防火墙的基本功能是阻止来自可疑网络/来源的连接。它会检查所有连接的源地址、目的地址和端口,并决定是否允许或阻止流量。防火墙的每个操作都会记录为日志数据。监控和分析这些日志对于保护您的网络免受攻击至关重要。要这样做,您需要首先启用日志功能。以下是在Linux防火墙中启用......
  • mybatis动态sql标签
    根据条件--sql发生改变。需要使用mybatis的动态sql标签作用这些动态SQL标签在MyBatis中提供了灵活的查询和更新操作的能力,可以根据不同的条件动态生成SQL语句,使SQL映射文件更具可读性和可维护性。常见的mybatis动态sql标签<trim>:通过修剪SQL语句的开头和结尾来动态......
  • 【保姆级教程】10分钟搞定Linux安装JDK,小白也能轻松上手!
    本文将详细介绍如何在Linux系统上安装配置JDK环境,包括下载、安装、环境变量配置等全过程。一、准备工作1.1检查系统是否已安装JDKjava-version如果显示"commandnotfound",说明系统中还没有安装JDK。1.2下载JDK安装包访问Oracle官网下载页面:https://www.oracle.com/j......
  • 【RK3588 Linux 5.x 内核编程】-内核IO复用与poll
    内核IO复用与poll文章目录内核IO复用与poll1、IO复用2、Poll的使用2.1用户空间程序中使用Poll2.2在内核空间实现Poll3、驱动程序实现4、用户空间程序实现5、验证让我们假设应用程序想要根据其状态读取/写入许多IO(输入和输出)的情况。在这种情况......
  • Linux上安装和配置Syncthing,实现文件同步
    1、下载最新部署包curl-shttps://api.github.com/repos/syncthing/syncthing/releases/latest|grepbrowser_download_url|greplinux-amd64|cut-d'"'-f4|wget-qi-2、解压并安装tar-xvfsyncthing-linux-amd64-v1.28.1.tar.gzmvsyncthing-linux-amd64-v1.2......
  • Linux通过命令行nmcli工具控制WiFi
    nmcli是NetworkManager提供的命令行工具,它是大多数现代Linux发行版中默认包含的工具,功能非常强大,可以帮助管理网络连接,包括WiFi、以太网等。nmcli不仅可以查看可用的WiFi网络,还支持连接、断开和管理网络设置。安装(大多数发行版默认已安装nmcli):sudoaptinstallnetwor......
  • 静态类和静态构造函数
    静态类用static修饰的类只能包含静态成员且不能被实例化staticclassTestStatic{//静态成员变量publicstaticinttestIndex=0;//静态方法publicstaticvoidTestFun(){}//静态成员属性publicstaticintTestIndex{......