linux同名库修改方案

文章详细阐述了LIBRARY_PATH和LD_LIBRARY_PATH环境变量在Linux系统中动态链接库查找的不同作用,以及动态库加载的顺序,包括RPATH和RUNPATH。同时,展示了如何通过Makefile设置编译规则来影响库的查找路径。

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

基础知识:

LIBRARY_PATH环境变量与LD_LIBRARY_PATH环境变量的区别:

LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目录。

LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径

linux动态库加载时序:

  1. RPATH: 写在elf文件中

  1. LD_LIBRARY_PATH: 环境变量

  1. RUNPATH: 写在elf文件中

  1. ldconfig的缓存: 配置/etc/ld.conf*可改变

  1. 默认的/lib, /usr/lib

所以我们需要的是RPATH 而不是RUNPATH ,这个就是我们下面编译脚本指令的设计原则;

代码目录架构:

.

├── libdemo.c

├── libdemo.h

├── Makefile

└── testdemo

├── Makefile

├── test.c

libdemo.c代码如下:

#include <stdio.h>
#include "libdemo.h"

void add(void)
{
    printf("wwj demo test: this is a library...chaoren\n");
    return ;
}

libdemo.h代码如下:

#ifndef _LIBDEMO_
#define _LIBDEMO_

void add(void);

#endif

Makefile 代码如下:

OBJS = libdemo.o #.o文件与.cpp文件同名
LIB = libcrypt.so # 目标文件名 

all : $(LIB)
%.o : %.c
    $(CC) $(CFLAGS) -fpic -c $< -o $@

$(LIB) : $(OBJS)
    rm -f $@
    $(CC) -shared -o $@ $(OBJS)
    rm -f $(OBJS)

tags :
    ctags -R *

clean:
    rm -f $(OBJS) $(LIB)

测试目录代码如下:

test.c代码:

#include <stdio.h>
#include "../libdemo.h"

void main(void){
    add();
    return;
}

Makefile代码:

CC = gcc
LD = ld
CFLAGS := -Wl,-rpath,.. -Wl,--disable-new-dtags
LDFLAGS :=-l crypt -L ..
all : testdemo
OBJS = test.c
TARGET = test

testdemo : $(OBJS)
    $(CC) $< -o $@ $(LDFLAGS) $(CFLAGS) 

tags :
    ctags -R *
clean:
    rm -f testdemo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值