加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux 生成动态库和静态库

发布时间:2022-11-01 15:06:37 所属栏目:Linux 来源:互联网
导读: 库分为两种:
共享库 : shared library,,命名规则一般为libxxx.so
静态库:static library,,命名规则一般为libxxx.a
nm命令 可以查看库中的符号:nm libxxx.so
生成动态库命令:
生成

库分为两种:

共享库 : shared library,,命名规则一般为libxxx.so

静态库:static library,,命名规则一般为libxxx.a

nm命令 可以查看库中的符号:nm libxxx.so

生成动态库命令:

生成.o文件(-fPIC)-fPIC则表明使用地址无关代码。PIC:Position Independent Code.

Linux下编译共享库时,必须加上-fPIC参数,否则在链接时会有错误提示

g++ -C -fPIC example.cpp -o example.o

生成动态库 添加命令-shared

g++ -shared example.o -o libexample.so

动态库的使用

编译:g++ -c main.cpp -o main.o

链接:g++ main.o -o excuteProgram -L. -lexample

-L. 表示链接动态库,指定文件的位置,.点号表示当前目录,L可以指定多个

-lexample 表示使用libexample.so这个库文件

说明:linux在查找库文件时是不会从相对路径来寻找的,,所以库文件要添加到linux的查找路径中linux动态库,,

一般的做法是,添加环境变量LD_LIBRARY_PATH

命令:export LD_LIBRARY_PATH=. 将当前目录添加到环境变量

echo $LD_LIBRARY_PATH 显示当前的环境变量

readelf -d exe 可以查看执行文件依赖的动态库

makefile 生成动态库

#makefile 文件的命令前为tab键
#变量名直接赋值,使用符号$(EXE)取出变量值
#excutable file name 
EXE = linuxProgram.so
#all folder,存放源文件的文件夹
SUBDIR = src outMessage
 
#执行foreach函数遍历文件夹获取cpp文件
#get all cpp files
CXX_SOURCES = $(foreach dir,$(SUBDIR),$(wildcard $(dir)/*.cpp))
#get all .o files
CXX_OBJECTS = $(patsubst %.cpp, %.o, $(CXX_SOURCES))
 
#get all .d files, content is .h files
DEP_FILES = $(patsubst %.o, %.d, $(CXX_OBJECTS))
 
#compile 
$(EXE): $(CXX_OBJECTS)
	g++ -shared $(CXX_OBJECTS) -o $(EXE)
	
#-MMD 生成xxx.d 文件,xxx.d文件内容为 xxx.o: xxx.cpp xxx.h
#$<依赖列表名
#$@ 目标名
#-g:添加gdb调试选项。
%.o: %.cpp
	g++ -c -fPID -MMD $< -o $@
 
#包含.d文件,
-include $(DEP_FILES)
 
clean:
	rm -rf $(CXX_OBJECTS) $(DEP_FILES) $(EXE)

生成静态库

g++ -c test1.cpp -o test1.o

g++ -c test2.cpp -o test2.o

ar -rcs libtest.a test1.o test2.o //生成静态库

nm libtest.a //查看静态库中的内容

使用:

libtest.a 的本质就是test1.o 和 test2.o 的打包,可以像使用.o文件一样使用.a文件

g++ main.cpp libtest.a -o helloworld

也可以像动态库一样使用

g++ main.cpp -o helloworld -L /home/path -ltest //使用库的名字就好

(编辑:晋中站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!