当前位置: 首页 > news >正文

成都住房和城乡建设局网站首页获奖网站设计

成都住房和城乡建设局网站首页,获奖网站设计,电子商务网站建设规划范文,浙江省城乡和建设厅网站文章目录 一、背景前提 二、静态编译概述1、执行静态编译设置CGO_ENABLED方式指定link方式 2、编译报错分析#xff08;1#xff09;确认系统上有没有安装libopus#xff08;2#xff09;设置LD_LIBRARY_PATH 三、详细排查过程1、下载bpf排查工具bcc, bcc-tools,python-bcc… 文章目录 一、背景前提 二、静态编译概述1、执行静态编译设置CGO_ENABLED方式指定link方式 2、编译报错分析1确认系统上有没有安装libopus2设置LD_LIBRARY_PATH 三、详细排查过程1、下载bpf排查工具bcc, bcc-tools,python-bcc2、使用opensnoop 排查编译过程查找共享库的路径都有哪些3、pacman下载opus包4、查看当前的libopus.so文件的版本5、下载libopus.a6、.deb文件解压缩7、添加LD_LIBRARY_PATH8、添加LIBRARY_PATH为当前目录9、LD_LIBRARY_PATH和LIBRARY_PATH的区别 一、背景 一个简单的音视频解析go程序需要放到一台没有go环境的机器中去运行都是linux环境本来以为是可以无缝迁移的。但实际上却发现运行报错glibc版本不一致。。。 因此打算直接编一个纯静态的可执行程序依赖库都直接编译进去这样就可以做到真正的无视平台限制。谁知道静态编译直接报错好吧那就总结一下静态编译相关知识点并记录一下排查流程吧 前提 博主使用的是manjaro版本的linux目标服务器是ubuntu版本且版本比较老。 二、静态编译概述 go默认是使用静态编译的方式如果go代码中使用的库不依赖C库的话。不过复杂点的go程序使用的包大概率是依赖系统C库的所以编译出来的文件是动态的例如可以通过ldd命令查看可执行程序以来的.so文件。 ldd 可执行程序linux-vdso.so.1 (0x00007ffeeaee7000)libresolv.so.2 /usr/lib/libresolv.so.2 (0x00007ff3838a6000)libc.so.6 /usr/lib/libc.so.6 (0x00007ff3836bf000)/lib64/ld-linux-x86-64.so.2 /usr/lib64/ld-linux-x86-64.so.2 (0x00007ff3838d3000)具体为什么会动态编译原理可以参考 【go可执行文件的外部依赖】 1、执行静态编译 静态编译有两种方式 设置CGO_ENABLED方式 默认情况下go的runtime环境变量CGO_ENABLED1即默认开始cgo允许你在go代码中调用C代码go的pre-compiled标准库的.a文件也是在这种情况下编译出来的。 我们可以在命令行指定CGO_ENABLED0就可以静态编译 CGO_ENABLED0 go build .指定link方式 go默认是使用internal linking而无需启动外部external linker(如:gcc、clang等)。而external linking机制则是cmd/link将所有生成的.o都打到一个.o文件中再将其交给外部的链接器比如gcc或clang去做最终链接处理。 我们想要静态编译的话需要在 -ldflags 中指定linkmode参数为external并且指定是静态链接。 -ldflags -linkmode external -extldflags -static 忽略-linkmode external 只设置-extldflags 也是ok的静态编译一个项目编译命令 go build -o myapp -ldflags -w -s -extldflags -static编译报错 /usr/lib/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1 /usr/bin/ld: cannot find -lopus: No such file or directory collect2: error: ld returned 1 exit status 2、编译报错分析 /usr/bin/ld 是 Linux 系统中的链接器linker用于将目标文件和库文件等链接起 来生成最终的可执行文件或共享库。在大多数情况下这个链接器已经默认设置 好并且可以自动被编译器调用。而对于 Go 语言的静态编译过程我们需要在编译命令中加入相应的选项指定使用 外部链接模式和静态链接方式并将必要的库文件链接到生成的二进制文件中。具体 来说可以使用 -ldflags 选项传递参数给链接器包括 -linkmode external 表示启用 外部链接模式、-extldflags -static 表示启用静态链接方式等。 看起来是没找到libopus我们先确认本机上有没有安装libopus 1确认系统上有没有安装libopus ldconfig -p | grep libopus通过包管理器查询libopus pacman -Ql opus | grep libopus opus /usr/lib/libopus.so opus /usr/lib/libopus.so.0 opus /usr/lib/libopus.so.0.8.0 2设置LD_LIBRARY_PATH 这个环境变量用于指定程序在运行时动态加载共享库也称为动态链接库时所要搜索的路径。当程序需要加载某个共享库时它会按照以下顺序搜索路径 程序中已经指定的库路径如使用 -L 参数指定的路径 LD_LIBRARY_PATH 中指定的路径export LD_LIBRARY_PATH/usr/lib:$LD_LIBRARY_PATH 继续静态编译还是寻找libopus失败。 ok开始有点意思了我们下面详细排查下。 三、详细排查过程 1、下载bpf排查工具bcc, bcc-tools,python-bcc 需要指定版本的话使用这个命令 sudo /usr/bin/pip install -i https://pypi.org/simple bcc0.27.0 bcc是一种跨平台的工具集可用于在Linux系统上进行动态追踪和探查。其中的opensnoop工具可以用于监视应用程序打开、读取或写入文件的系统调用以了解系统中哪些文件被访问以及它们是如何被访问的。主要监听open()、read()、write()等与文件操作相关的系统调用。 strace也能查看系统调用函数这里使用opensnoop来进行排查。 2、使用opensnoop 排查编译过程查找共享库的路径都有哪些 # 开启一个窗口输入这个命令 sudo opensnoop# 开启另一个窗口进行编译 go build -o myapp -ldflags -w -s -extldflags -static -lm# 查看opensnoop的输出 结果发现编译过程中查找的是libopus.a文件我们只有libopus.so文件 3、pacman下载opus包 # 查看安装opus都会安装什么东西 sudo pacman -Ql opus# 结果是没有.a文件看来只能自己编译出来.a文件或者去其他包管理平台下载了。。。 4、查看当前的libopus.so文件的版本 # 查看.so的版本 sudo pacman -Qo /usr/lib/libopus.so /usr/lib/libopus.so is owned by opus 1.3.1-35、下载libopus.a https://ubuntu.pkgs.org/20.04/ubuntu-main-amd64/libopus-dev_1.3.1-0ubuntu1_amd64.deb.html查询到ubuntu上的libopus包是带有libopus.a文件的。版本也能对得上下载即可。 6、.deb文件解压缩 # 下载地址 https://www.cyberciti.biz/faq/how-to-extract-a-deb-file-without-opening-it-on-debian-or-ubuntu-linux/# 查看下载的.deb包 file libopus-dev_1.3.1-0ubuntu1_amd64.deb libopus-dev_1.3.1-0ubuntu1_amd64.deb: Debian binary package (format 2.0), with control.tar.xz, data compression xz# 解压缩deb包 ar x libopus-dev_1.3.1-0ubuntu1_amd64.deb # 解压完毕后会出现几个文件主要用到data.tar.gz包这个是存放二进制文件的压缩包# 解压缩tar tar -xvf data.tar.xz # 可以发现libopus.a文件 ./usr/lib/x86_64-linux-gnu/libopus.a 7、添加LD_LIBRARY_PATH 直接把libopus.a文件放到当前目录并设置搜索共享库路径。 export LD_LIBRARY_PATH.:$LD_LIBRARY_PATH执行编译依然报错好像没有生效。 8、添加LIBRARY_PATH为当前目录 # 执行静态编译成功# 查看静态编译文件 file myapp myapp: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]8afbe7cba97e5f860ac49cfb6692e5eb5ec18cd5, for GNU/Linux 4.4.0, stripped 9、LD_LIBRARY_PATH和LIBRARY_PATH的区别 LD_LIBRARY_PATH 和 LIBRARY_PATH 都是用于指定共享库搜索路径的环境变量但有一些细微的区别。 LD_LIBRARY_PATH 主要用于控制程序运行时加载共享库的路径 而 LIBRARY_PATH 则主要用于控制编译器在编译时寻找共享库的路径。 静态编译要链接的是.a文件LD_LIBRARY_PATH主要是设置.so文件的搜索路径所以就不生效 end
http://www.pierceye.com/news/681928/

相关文章:

  • 佛山电商网站制作wordpress评论显示地址
  • 自己怎样用手机建网站化妆品网站模板免费下载
  • 当今做哪个网站致富早期网页游戏
  • 手机网站开发指南西安做网站的
  • php网站搬家教程装修网站建设方案书
  • 上海建网站工作室网络设计培训学校长沙
  • 手机自建网站平台如何寻找seo网站建设客户
  • 网站按关键词显示广告图片这样制作公司网站
  • 桂林建站平台哪家好北京注册公司查询
  • c 高性能网站开发淄博学校网站建设方案
  • 网站建设网站维护的具体内容是什么wordpress主题模板调用
  • 专业网站建设公创建app软件
  • 佛山哪家网站建设比较好互联网内容服务商有哪些
  • 商家在携程旅游网站怎样做宣传ppt免费下载素材库
  • 下载建设银行官方网站下载网站模块介绍
  • 网站定制开发公司推荐网站续费问题
  • 专注七星彩网站开发出租云服务器上建网站
  • 天津做网站.都找津坤科技中国菲律宾历史战绩
  • 网站建设合同的效力网站建设公司需要交税么
  • 色弱可以做网站开发吗建网站的步骤及方法
  • 卖衣服的网站排名discuz分类信息模板
  • 广西网站开发公司招聘网页制作软件
  • 网站框架一般用什么做dede搭建网站教程
  • 郑州网站开发比较好的网络公司网络推广公司有多少家
  • 银川做网站服务免费word模板
  • 个人网站备案方法网站开发制作云盘
  • 培训做网站传奇手游发布网站
  • 中国保密在线网站培训系统手机购物平台
  • 厦门网站制作建设沐风 wordpress 主题
  • 网站选择城市怎么做北京招聘信息