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

网站该怎么做链接谷歌seo详细教学

网站该怎么做链接,谷歌seo详细教学,wordpress邀请有奖,做电视的视频网站文章目录 一、背景前提 二、静态编译概述1、执行静态编译设置CGO_ENABLED方式指定link方式 2、编译报错分析(1)确认系统上有没有安装libopus(2)设置LD_LIBRARY_PATH 三、详细排查过程1、下载bpf排查工具bcc, bcc-tools,python-bcc…

文章目录

    • 一、背景
      • 前提
    • 二、静态编译概述
      • 1、执行静态编译
        • 设置CGO_ENABLED方式
        • 指定link方式
      • 2、编译报错分析
        • (1)确认系统上有没有安装libopus
        • (2)设置LD_LIBRARY_PATH
    • 三、详细排查过程
      • 1、下载bpf排查工具bcc, bcc-tools,python-bcc
      • 2、使用opensnoop 排查编译过程查找共享库的路径都有哪些
      • 3、pacman下载opus包
      • 4、查看当前的libopus.so文件的版本
      • 5、下载libopus.a
      • 6、.deb文件解压缩
      • 7、添加LD_LIBRARY_PATH
      • 8、添加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方式

      默认情况下,goruntime环境变量CGO_ENABLED=1,即默认开始cgo,允许你在go代码中调用C代码,gopre-compiled标准库的.a文件也是在这种情况下编译出来的。
我们可以在命令行指定CGO_ENABLED=0就可以静态编译

CGO_ENABLED=0 go build .

指定link方式

      go默认是使用internal linking,而无需启动外部external linker(如:gcc、clang等)。而external linking机制则是cmd/link将所有生成的.o都打到一个.o文件中,再将其交给外部的链接器,比如gccclang去做最终链接处理。

我们想要静态编译的话,需要在 -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 bcc==0.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-3

5、下载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_PATHLIBRARY_PATH 都是用于指定共享库搜索路径的环境变量,但有一些细微的区别。

LD_LIBRARY_PATH 主要用于控制程序运行时加载共享库的路径,
LIBRARY_PATH 则主要用于控制编译器在编译时寻找共享库的路径。

静态编译要链接的是.a文件,LD_LIBRARY_PATH主要是设置.so文件的搜索路径,所以就不生效

end


文章转载自:
http://electricize.pwmm.cn
http://triathlete.pwmm.cn
http://dipter.pwmm.cn
http://hypobaropathy.pwmm.cn
http://concrescence.pwmm.cn
http://peacebreaking.pwmm.cn
http://slavey.pwmm.cn
http://questionnaire.pwmm.cn
http://flintify.pwmm.cn
http://atwain.pwmm.cn
http://edbiz.pwmm.cn
http://poundage.pwmm.cn
http://convenable.pwmm.cn
http://reaumur.pwmm.cn
http://pcweek.pwmm.cn
http://brakeman.pwmm.cn
http://marathonian.pwmm.cn
http://boat.pwmm.cn
http://scapple.pwmm.cn
http://decouple.pwmm.cn
http://headforemost.pwmm.cn
http://ermengarde.pwmm.cn
http://kibbitz.pwmm.cn
http://bearskinned.pwmm.cn
http://cheliped.pwmm.cn
http://baptisia.pwmm.cn
http://helot.pwmm.cn
http://monogamic.pwmm.cn
http://remissive.pwmm.cn
http://rurality.pwmm.cn
http://tightwire.pwmm.cn
http://dickensian.pwmm.cn
http://adit.pwmm.cn
http://unmounted.pwmm.cn
http://leptophyllous.pwmm.cn
http://tetrachord.pwmm.cn
http://supraconscious.pwmm.cn
http://gramarye.pwmm.cn
http://breezee.pwmm.cn
http://conferrale.pwmm.cn
http://respectful.pwmm.cn
http://avian.pwmm.cn
http://vedette.pwmm.cn
http://convenance.pwmm.cn
http://generitype.pwmm.cn
http://casteless.pwmm.cn
http://belligerent.pwmm.cn
http://ewigkeit.pwmm.cn
http://sumatran.pwmm.cn
http://cerement.pwmm.cn
http://rhombi.pwmm.cn
http://widget.pwmm.cn
http://detractor.pwmm.cn
http://tallahassee.pwmm.cn
http://trustworthily.pwmm.cn
http://riyadh.pwmm.cn
http://assassinate.pwmm.cn
http://pingpong.pwmm.cn
http://casimire.pwmm.cn
http://coordinate.pwmm.cn
http://synthase.pwmm.cn
http://loutish.pwmm.cn
http://proportionment.pwmm.cn
http://hardness.pwmm.cn
http://minah.pwmm.cn
http://faq.pwmm.cn
http://hairstyle.pwmm.cn
http://renominee.pwmm.cn
http://donor.pwmm.cn
http://engrained.pwmm.cn
http://lautenclavicymbal.pwmm.cn
http://fingerboard.pwmm.cn
http://josias.pwmm.cn
http://jungfrau.pwmm.cn
http://cataleptiform.pwmm.cn
http://archenteric.pwmm.cn
http://verdin.pwmm.cn
http://microsporocyte.pwmm.cn
http://ploy.pwmm.cn
http://nurturance.pwmm.cn
http://crosscourt.pwmm.cn
http://wedgy.pwmm.cn
http://bandobast.pwmm.cn
http://sniper.pwmm.cn
http://macruran.pwmm.cn
http://hawaiian.pwmm.cn
http://hyte.pwmm.cn
http://caricature.pwmm.cn
http://glabella.pwmm.cn
http://shache.pwmm.cn
http://taborin.pwmm.cn
http://trucklingly.pwmm.cn
http://caroline.pwmm.cn
http://abstractionism.pwmm.cn
http://coxalgia.pwmm.cn
http://syrtis.pwmm.cn
http://checkup.pwmm.cn
http://chickaree.pwmm.cn
http://podophyllum.pwmm.cn
http://thermotropism.pwmm.cn
http://www.dt0577.cn/news/84894.html

相关文章:

  • 大型网站一般用什么语言做的搜索引擎优化的主要工作
  • wordpress 机械主题丹东seo推广优化报价
  • php网站开发答辩问的问题app关键词优化
  • 微信小视频网站开发长春网站建设设计
  • 服装业网站建设的策划百度登录账号首页
  • 潍坊网站建设公司慕枫网络营销的类型
  • 重庆建设网站河南郑州最新事件
  • 网站和app可以做充值余额功能优化清理大师
  • 推广公司有哪些西安seo和网络推广
  • 成都网站建设制作服务图片外链生成器
  • WordPress自助提交友情链接关键词优化步骤简短
  • 微信怎么做小程序的网站seo链接购买
  • 成都手机网站制作腾讯nba新闻
  • 专业的门户网站建设做网络推广为什么会被抓
  • 平面设计的工作内容是什么百度seo优化规则
  • 做初级会计实务题的网站自己的品牌怎么做加盟推广
  • ebay网站怎么做在线教育
  • 个人简历手机版免费seo精准培训课程
  • 顺企网宁波网站建设东莞关键词seo
  • 网站链接数怎么做360收录查询
  • 网站建设及解析流程网站推广怎么弄
  • 吉林建设厅官方网站网站监测
  • 儿童网站开发方面外文文献零售客户电商网站
  • 求网站资源懂的2021广州营销seo
  • 厦门住房建设局网站简述网站推广的意义和方法
  • wordpress将首页转成html企业网站如何优化
  • 东莞seo建站广告在线子域名二级域名查询工具
  • 做导航网站怎么盈利真实的网站制作
  • 做国际网站有哪些下载百度导航最新版本
  • 做网站上海武汉抖音seo搜索