赞
踩
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指定库路径即可,编译出的程序已经从静态库里取到对应的资源了,不是运行时加载库,所以运行正常。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。