Linux 动态库创建及链接

linux 下动态库是以.so为结尾的,在编译.o文件时添加-fPIC选项,在编译so动态库时添加-shared选项,如有Makefile:

COMPILE_DIR = compile
LIB_DIR = lib

CC = g++ -std=c++11
CFLAGS = -Werror


SRCS = $(wildcard *.cpp)
OBJS = $(patsubst %.cpp, $(COMPILE_DIR)/%.o, $(SRCS))
DEP = $(patsubst %.o, %.d, $(OBJS))

$(shell if [ ! -d $(COMPILE_DIR) ]; then mkdir $(COMPILE_DIR); fi)
$(shell if [ ! -d $(LIB_DIR) ]; then mkdir $(LIB_DIR); fi)


SHAREDLIB=libUserCenter.so

all: $(SHAREDLIB)

-include $(DEP)

$(SHAREDLIB): $(OBJS)
	@$(CC) -shared -o $@ $^
	@mv $@ $(LIB_DIR)
$(COMPILE_DIR)/%.o: %.cpp $(COMPILE_DIR)/%.d
	$(CC) -fPIC -c $< -o $@

$(COMPILE_DIR)/%.d: %.cpp
	$(CC) $(CFLAGS) -fPIC -MM -E -c $< -o $@
	@sed 's/.*\.o/$(subst /,\/,$(dir $@))&/g' $@ > $@.tmp
	@mv $@.tmp $@

.PHONY: clean
clean:
	rm -rf $(LIB_DIR)/* $(COMPILE_DIR)/*

编译出的so要使用,最方便的方式是直接用-lxxx,如上面的库要使用应该用-lUserCenter即可,但这个有前提条件,即这个库应该位于默认库搜索路径下,如: /lib/、/usr/lib/,但当你没有权限拷贝自己的库到默认库目录下时,或者你只是用这个库进行测试时,那就要通过其他方式操作了。如以下遇到的问题:

1,编译链接时没有问题,但运行时找不到库

2,ldd查看程序链接了哪些库

 

确实是没有找到,一开始以为是编译的问题,但编译时能找到,为什么运行时找不到呢?因为运行时需要去加载这个库,但我们确实没有指定去哪里加载,所以运行时找不到,修改环境变量LD_LIBRARY_PATH即可,因为程序运行时会通过此环境变量去查找库进行加载(还有通过其他加载,这里不详说)。所以修改如下 :

再用ldd查看,已经能找到库了,可以正常运行了。 

注意:动态库使用和静态库使用不一样,静态库在编译时添加-L指定库路径即可,编译出的程序已经从静态库里取到对应的资源了,不是运行时加载库,所以运行正常。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值