linux 共享库的编译和连接

本文详细介绍了在Linux环境下,如何编译和链接静态库与共享库(动态库)。通过实例展示了静态库和共享库的创建过程,以及解决共享库找不到的问题。同时讨论了库函数重名时的链接优先级,并探讨了静态库和共享库同名时的链接规则。最后总结了动态库的隐式调用和显式调用两种方式,强调了动态库在运行时的加载特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当前目录下总共有7个源文件:slib.h、slib1.c、slib2.c、main.c、dlib.h、dlib1.c、dlib2.c,其中slib.h是静态库公共头文件,slib1.c将编译成静态库libslib1.a,slib2.c将编译成静态库libslib2.a,dlib.h是共享库(即通常说的动态库)公共头文件,dlib1.c将编译成共享库libdlib1.so,dlib2.c将编译成共享库libdlib2.so,main.c是主程序,链接libslib1.a、libslib1.a、libdlib1.so、libdlib2.so。

slib.h、slib1.c、slib2.c 这三个文件不变,与 linux 静态库的编译和连接过程遇到的问题 一样。

dlib.h、dlib1.c、dlib2.c、main.c 的源码:

// dlib.h
#include <stdio.h>

int dlib_add(int a, int b);
void dlib_print(const char *str);

int dlib_sub(int a, int b);
void dlib_print2(const char *str);
// dlib1.c
#include "dlib.h"

int dlib_add(int a, int b)
{
    return a + b;
}

void dlib_print(const char *str)
{
    if(str)
        printf("file:%s, fun:%s, line:%d, str:%s\n", __FILE__, __FUNCTION__, __LINE__, str);
    else
        printf("file:%s, fun:%s, line:%d, str is NULL\n", __FILE__, __FUNCTION__, __LINE__);
}
// dlib2.c
#include "dlib.h"

int dlib_sub(int a, int b)
{
    return a - b;
}

void dlib_print2(const char *str)
{
    if(str)
        printf("file:%s, fun:%s, line:%d, str:%s\n", __FILE__, __FUNCTION__, __LINE__, str);
    else
        printf("file:%s, fun:%s, line:%d, str is NULL\n", __FILE__, __FUNCTION__, __LINE__);
}
// main.c 
#include "slib.h"
#include "dlib.h"

int main(int agrc, char **agrv)
{
    printf("*.a .....\n");
    printf("add:%d, sub:%d\n", add(1, 2), sub(3, 4));
    print("Hello world!");
    print2("Hi, world!");
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值