基础知识:
LIBRARY_PATH环境变量与LD_LIBRARY_PATH环境变量的区别:
LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目录。
LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径
linux动态库加载时序:
RPATH: 写在elf文件中
LD_LIBRARY_PATH: 环境变量
RUNPATH: 写在elf文件中
ldconfig的缓存: 配置/etc/ld.conf*可改变
默认的/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