当前位置: 首页 > 面试题库 >

我可以使用同名的库和二进制文件吗?

阳建弼
2023-03-14
问题内容

我正在构建一个库,但我也希望它可以作为独立的二进制文件使用。

例如,假设我正在构建Tar的实现。Tar通常用作命令,但也可以用作库。凭直觉,我会做这样的事情:

src/
    tar/
        tar.go # belongs to package tar
        main.go # imports tar and provides a main function

不过,这似乎不起作用。从文档中看来,“命令”应该具有与库不同的名称。使此处给出的示例适应此示例,我具有以下目录结构:

src/
    tar/
        tar.go # belongs to package tar
    tarbin/
        main.go # imports tar and provides a main function

但是,这会创建一个名为的命令tarbin,而不是tar中的命令$GOPATH/bin。我发现的解决方法是执行go build -o $GOPATH/bin/tar tar,但是我感觉到自己在做错误的事情。有没有更好的办法?

注意: 我很清楚它tar包含在标准库中,我仅以它为例。


问题答案:

我可能会这样做

src/
    tar/
        tar.go         # tar libary
        tar/
            main.go    # tar binary

那会给你一个二进制文件tar和一个库文件tar

假设您将其托管在github上,然后

src/
    github.com/
        you/
            tar/
                tar.go         # tar libary
                tar/
                    main.go    # tar binary

当您执行此操作时,将为您提供一个名为tar的二进制文件,当您执行go get install github.com/you/tar/tar该操作github.com/you/tar时将为您提供一个库go get install github.com/you/tar

根据您认为哪个更重要,可以交换库和二进制文件

src/
    github.com/
        you/
            tar/
                main.go            # tar binary
                tar/
                    tar.go         # tar libary

将所有代码保存在一棵树中,使您能够go install ./...从根本上构建所有软件包和子软件包,这是一个优势。 go test|fmt ./...也。(请注意,实际上是3点!)



 类似资料:
  • 我想制作一个Rust包,它既包含一个可重用库(大部分程序都在这里实现),也包含一个使用它的可执行文件。 假设我没有混淆 Rust 模块系统中的任何语义,我的 文件应该是什么样子的?

  • 问题内容: 我有一个计划用于废料堆的旧可执行文件,但是还不存在。它依赖于已经从我的环境中删除的一些库,但是我在某些可以正常工作的地方有一些存根库。我想将此可执行文件指向这些存根库。是的,我可以设置LD_LIBRARY_PATH,但是许多脚本都调用了此可执行文件,许多用户也希望将其修复在一处。 我没有这个来源,很难得到它。我在想- 是否可以使用支持ELF的编辑器编辑此文件,并向rpath添加一个简单

  • 问题内容: 我为dlopen编写了一个程序 但我收到“分段错误”错误,我使用.so库测试了该程序,它可以工作,但无法使其自身运行 问题答案: 您需要编写代码: 仔细阅读dlopen(3),始终检查那里的&函数是否成功,并在失败时使用。 并用编译上面的文件 不要忘记获得所有警告和标志(以便能够将自己的符号放入动态表中)。 在我的Debian / Sid / x86-64系统上(版本4.8.2和版本2

  • 问题内容: 假设我主要是Linux用户,但是我正在Go中开发一个我希望成为跨平台的应用程序。我到处搜寻,但似乎找不到能满足以下条件的信息: 如果我在amd64 Ubuntu系统上使用二进制文件,那么它也可以在 其他任何人的 64位Ubuntu / Debian系统上运行吗? 我如何使用它来构建一个x86_64二进制文件,该二进制文件也将在32位Debianlikes上开箱即用? 如果必须使用Win

  • 问题内容: 我想计算mysql表中的行数,而不要包含重复的条目, 我可以用吗? 问题答案: 当然。

  • 我想在一个项目中使用两种方法(反应式和标准式)。 我尝试将一个REST APIendpoint迁移到反应式webflux,并在迁移其余endpoint之前测试性能。但没用。我为他添加了路由器和处理程序,但直到我没有从依赖项中删除,并禁用之前,我一直得到http代码。有没有可能?还是我应该将所有项目迁移到反应式方法?