当前位置:   article > 正文

Linux 动态库创建及链接_linux 库复制到lib 注册

linux 库复制到lib 注册

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

  1. COMPILE_DIR = compile
  2. LIB_DIR = lib
  3. CC = g++ -std=c++11
  4. CFLAGS = -Werror
  5. SRCS = $(wildcard *.cpp)
  6. OBJS = $(patsubst %.cpp, $(COMPILE_DIR)/%.o, $(SRCS))
  7. DEP = $(patsubst %.o, %.d, $(OBJS))
  8. $(shell if [ ! -d $(COMPILE_DIR) ]; then mkdir $(COMPILE_DIR); fi)
  9. $(shell if [ ! -d $(LIB_DIR) ]; then mkdir $(LIB_DIR); fi)
  10. SHAREDLIB=libUserCenter.so
  11. all: $(SHAREDLIB)
  12. -include $(DEP)
  13. $(SHAREDLIB): $(OBJS)
  14. @$(CC) -shared -o $@ $^
  15. @mv $@ $(LIB_DIR)
  16. $(COMPILE_DIR)/%.o: %.cpp $(COMPILE_DIR)/%.d
  17. $(CC) -fPIC -c $< -o $@
  18. $(COMPILE_DIR)/%.d: %.cpp
  19. $(CC) $(CFLAGS) -fPIC -MM -E -c $< -o $@
  20. @sed 's/.*\.o/$(subst /,\/,$(dir $@))&/g' $@ > $@.tmp
  21. @mv $@.tmp $@
  22. .PHONY: clean
  23. clean:
  24. rm -rf $(LIB_DIR)/* $(COMPILE_DIR)/*

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

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

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

 

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

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

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/128722
推荐阅读
相关标签
  

闽ICP备14008679号