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

linux 生成动态库和静态库

发布时间:2022-11-24 12:48:57 所属栏目: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 //使用库的名字就好
 

(编辑:PHP编程网 - 钦州站长网)

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