对go语言而言,跟踪init很显然包有且仅有一次被导入的可能。

但是重复引用了goquery包,后编译出现问题

项目涉及相关目录

├── main.go
└── parse
    └── parse.go

parse包和main.go都导入了 goquery包

main.go 通过 import("./parse")导入parse包

go run 和 go build 都提示错误

# command-line-arguments
/usr/lib/golang/pkg/tool/linux_amd64/link: cannot open file /usr/lib/golang/pkg/linux_amd64/github.com/PuerkitoBio/goquery.a: open /usr/lib/golang/pkg/linux_amd64/github.com/PuerkitoBio/goquery.a: no such file or directory

main.go 在不导入 parse时并无错误,说明肯定是parse的锅

查看了gopath pkg 里明明有.a文件 但是为什么寻找到去goroot下寻找.a文件

最后先是找到了解决方案 把parse导入方式切换到绝对路径(这里的绝对路径是相对于gopath或者goroot而言,即包的真实路径去掉gopath/src或者goroot/src)导入即可,后发现编译情况下link参数是空目录

go run -n  main.go 命令仅打印其执行过程中用到的所有命令,而不去真正执行它们。用这个命令跟踪编译过程是十分合适的。

运行结果如下

 cd /home/fdf/golang/src/distributed_spider/parse
/usr/lib/golang/pkg/tool/linux_amd64/compile -o $WORK/_/home/fdf/golang/src/distributed_spider/parse.a -trimpath $WORK -goversion go1.9.4 -p _/home/fdf/golang/src/distributed_spider/parse -complete -buildid 310d9ff51b345d53a619be2244f0ac16bed09600 -D _/home/fdf/golang/src/distributed_spider/parse -I $WORK -I /home/fdf/golang/pkg/linux_amd64 -pack ./parse.go #
# command-line-arguments
# mkdir -p $WORK/command-line-arguments/_obj/
mkdir -p $WORK/command-line-arguments/_obj/exe/
cd /home/fdf/golang/src/distributed_spider
/usr/lib/golang/pkg/tool/linux_amd64/compile -o $WORK/command-line-arguments.a -trimpath $WORK -goversion go1.9.4 -p main -complete -buildid 69bf6dce457753ca5df015e4ac3556bd5ca464b1 -dwarf=false -D _/home/fdf/golang/src/distributed_spider -I $WORK -I /home/fdf/golang/pkg/linux_amd64 -pack ./main.go
cd .
/usr/lib/golang/pkg/tool/linux_amd64/link -o $WORK/command-line-arguments/_obj/exe/main -L $WORK -L "" -s -w -extld=gcc -buildmode=exe -buildid=69bf6dce457753ca5df015e4ac3556bd5ca464b1 $WORK/command-line-arguments.a
$WORK/command-line-arguments/_obj/exe/main

相对路径导入情况

 #
# distributed_spider/parse
# mkdir -p $WORK/distributed_spider/parse/_obj/
mkdir -p $WORK/distributed_spider/
cd /home/fdf/golang/src/distributed_spider/parse
/usr/lib/golang/pkg/tool/linux_amd64/compile -o $WORK/distributed_spider/parse.a -trimpath $WORK -goversion go1.9.4 -p distributed_spider/parse -complete -buildid 310d9ff51b345d53a619be2244f0ac16bed09600 -D _/home/fdf/golang/src/distributed_spider/parse -I $WORK -I /home/fdf/golang/pkg/linux_amd64 -pack ./parse.go #
# command-line-arguments
# mkdir -p $WORK/command-line-arguments/_obj/
mkdir -p $WORK/command-line-arguments/_obj/exe/
cd /home/fdf/golang/src/distributed_spider
/usr/lib/golang/pkg/tool/linux_amd64/compile -o $WORK/command-line-arguments.a -trimpath $WORK -goversion go1.9.4 -p main -complete -buildid fbcca07f20e1f56c4f1a586a3c879bde6e112ba5 -dwarf=false -D _/home/fdf/golang/src/distributed_spider -I $WORK -I /home/fdf/golang/pkg/linux_amd64 -pack ./main.go
cd .
/usr/lib/golang/pkg/tool/linux_amd64/link -o $WORK/command-line-arguments/_obj/exe/main -L $WORK -L /home/fdf/golang/pkg/linux_amd64 -s -w -extld=gcc -buildmode=exe -buildid=fbcca07f20e1f56c4f1a586a3c879bde6e112ba5 $WORK/command-line-arguments.a
$WORK/command-line-arguments/_obj/exe/main

绝对路径导入情况

跟踪发现 有差异的情况的确是 在相对路径下 -L的参数缺失了 goopath(相对..情况13行和绝对..情况19行)

导致 link去goroot下寻找

至于为什么会出现这种情况  还没弄明白,感觉真的像编译这边的bug。。。 明明前面编译的过程中都是能寻找到并输入.a文件的

但是导入包的时候尽量写绝对路径。

go语言,第三方包相对路径导入包引起的问题及解决方案(goquery)的更多相关文章

  1. [日常] Go语言圣经--包和文件-导入包习题

    1.每个包都有一个全局唯一的导入路径 2.按照惯例,一个包的名字和包的导入路径的最后一个字段相同 练习 2.2: 写一个通用的单位转换程序,用类似cf程序的方式从命令行读取参数,如果缺省的话则是从标准 ...

  2. python已安装了一个包,但是导入包中的模块时报错没有这个包

    执行import sys; print(sys.path)查看python搜索路径,确保自己的模块在python搜索路径中 python的搜索路径与包(package) python的搜索路径其实是一 ...

  3. Python 包内的导入问题(绝对导入和相对导入)

    基本概念 Python 中的包,即包含 __init__.py 文件的文件夹. 对于 Python 的包内导入,即包内模块导入包内模块,存在绝对导入和相对导入问题. 普通 Python 模块的搜索路径 ...

  4. Go语言- import 导入包的语法

    一 包的导入语法 在go语言中一个包(文件夹)中可以包含多个 go 文件,每一个文件通过文件第一行的 package 来指明自己所在的包,原则上应该与自己所在的文件夹同名,但也可以指定为其他名称,但同 ...

  5. Python 学习 第十五篇:模块搜索路径和包导入

    在导入自定义的模块时,除了指定模块名之外,也需要指定目录,由于Python把目录称作包,因此,这类导入被称为包导入.包导入把计算机上的目录变成Python的命名空间,而目录中所包含的子目录和模块文件则 ...

  6. 在ros功能包CMakeLists.txt中获取所在功能包的路径 便于添加第三方库的相对路径

    在 ros 功能包中要使用第三方的动态库,将其放在系统默认库路径和使用绝对路径均不可取,这样的话可移植性较差,将该功能包移到其它电脑时要重新配置依赖库的路径,太麻烦了. 于是找到下面这个方法,解决了R ...

  7. Eclipse 工程使用相对路径导入Jar包设置

    环境:MyEclipse 6.5 问题:MyEclipse 工程使用相对路径导入Jar包 我们在导入工程时,往往添加Jar都是使用的绝对路径,但这带来了一个问题,不同的用户使用工程都得重新配置Buil ...

  8. go语言基础之导入包的常用方法

    1.导入包 示例: 法一 package main //导入包,必须使用,否则编译不过 import "fmt" import "os" func main() ...

  9. go导入包

    go导入包 go有很多内置的函数,例如println,不需要引用即可使用.但是如果不借助go的标准库或者第三方库,我们能做的事情有限.在go中,使用关键字import在代码中导入一个包并使用. 修改我 ...

随机推荐

  1. dblink 简单使用

    create extension dblink查看连接:select dblink_get_connections()断开所有连接:select dblink_disconnect()断开指定名称的连 ...

  2. Unity---DOTween插件学习(4)---Andy老师自己写的动态效果工具插件

    本文及系列参考于Andy老师的DOTween系列 欢迎大家关注Andy老师 13.动态效果工具插件 这个插件是Andy老师自己利用DOTween写的按钮点击和显示的效果控件,有非常多的种类,还是挺好用 ...

  3. linux文件查找find

    一.locate locate基于数据库索引来查找文件,数据库在开机时一段时间对更新,不会实时更新,数据库存放在(/var/lib/mlocate/mlocate.db),可以用updatedb来手动 ...

  4. yum 缓存包到本地

    yum install –downloadonly –downloaddir=/root/mypackages/ vim 说明: --downloadonly 只下载 --downloaddir 下载 ...

  5. BZOJ 3673 可持久化并查集 by zky && BZOJ 3674 可持久化并查集加强版 可持久化线段树

    既然有了可持久化数组,就有可持久化并查集.. 由于上课讲过说是只能按秩合并(但是我也不确定...),所以就先写了按秩合并,相当于是维护fa[]和rk[] getf就是在这棵树中找,直到找到一个点的fa ...

  6. 成功安装tesserocr

    首先按照官网的操作,出现了下面的错误. 错误描述: x86_64-linux-gnu-gcc: error trying to exec 'cc1plus': execvp: 没有那个文件或目录 er ...

  7. 036 Valid Sudoku 有效的数独

    详见:https://leetcode.com/problems/valid-sudoku/description/ class Solution { public: bool isValidSudo ...

  8. Java面向对象_常用类库api——二叉树数据结构实现

    二叉树是每个节点最多有两个子树的有序树.通常子树被称为"左子树"和"右子树". 二叉树算法的排序规则: 1.选择第一个元素作为根节点 2.之后如果元素大于根节点 ...

  9. Linux Shell命令系列(2)

    6. history命令 “history”命令就是历史记录.它显示了在终端中所执行过的所有命令的历史. 7. sudo命令 “sudo”(super user do)命令允许授权用户执行超级用户或者 ...

  10. MapReduce实战:邮箱统计及多输出格式实现

    紧接着上一篇博文我们学习了MapReduce得到输出格式之后,在这篇博文里,我们将通过一个实战小项目来熟悉一下MultipleOutputs(多输出)格式的用法. 项目需求: 假如这里有一份邮箱数据文 ...