Golang如何通过源代码文件进行构建

Golang如何通过源代码文件进行构建 我遇到了一些问题,不知道是怎么回事?

我想构建源文件。

目录结构:

go -src -lib greet.go -main main.go

我使用了如下命令:

cd go;

go build -o lib.a -x -v src/lib/greet.go

编译器执行了以下操作:

WORK=/tmp/go-build656288917 command-line-arguments mkdir -p $WORK/b001/ cat >$WORK/b001/importcfg << ‘EOF’ # internal

import config

packagefile fmt=/usr/local/go/pkg/linux_amd64/fmt.a EOF cd /tmp/go/src/lib /usr/local/go/pkg/tool/linux_amd64/compile -o $WORK/b001/pkg.a -trimpath “$WORK/b001=>” -p command-line-arguments -complete -buildid rP94e3iTbzSluHW4oK35/rP94e3iTbzSluHW4oK35 -goversion go1.15.6 -D _/tmp/go/src/lib -importcfg $WORK/b001/importcfg -pack ./greet.go /usr/local/go/pkg/tool/linux_amd64/buildid -w $WORK/b001/pkg.a # internal cp $WORK/b001/pkg.a /root/.cache/go-build/04/04c8eab7a53e72ca62bc5f1ffd46a09eb7c7706d1aad671b93b2784fbe44edf9-d # internal mv $WORK/b001/pkg.a lib.a

我注意到在这个命令中出现了 command-line-arguments,即 -p command-line-arguments

/usr/local/go/pkg/tool/linux_amd64/compile -o $WORK/b001/_pkg_.a -trimpath "$WORK/b001=>" -p command-line-arguments -complete -buildid rP94e3iTbzSluHW4oK35/rP94e3iTbzSluHW4oK35 -goversion go1.15.6 -D _/tmp/go/src/lib -importcfg $WORK/b001/importcfg -pack ./greet.go

然后我继续执行:

go tool compile -I . src/main/main.go //获取 main.o
go tool link -L . main.o
main...inittask: relocation target lib...inittask not defined

我发现这是由于 -p command-line-arguments 导致的。

为什么?command-line-arguments 是一个函数吗?它返回什么?是一个普通的字符串吗?

在这个命令中:

/usr/local/go/pkg/tool/linux_amd64/compile -o $WORK/b001/_pkg_.a -trimpath "$WORK/b001=>" -p command-line-arguments -complete -buildid rP94e3iTbzSluHW4oK35/rP94e3iTbzSluHW4oK35 -goversion go1.15.6 -D _/tmp/go/src/lib -importcfg $WORK/b001/importcfg -pack ./greet.go

-p command-line-arguments 实际上替代了什么?


更多关于Golang如何通过源代码文件进行构建的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang如何通过源代码文件进行构建的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


command-line-arguments 是Go编译器在编译非main包时的默认包名,当您直接编译单个.go文件而不是整个包时会出现。这不是函数,而是编译器内部使用的字符串标识符。

问题根源在于您试图将单个源文件编译为库,但Go的构建系统期望完整的包结构。以下是正确的构建方式:

项目结构:

go/
├── src/
│   ├── lib/
│   │   ├── greet.go
│   │   └── go.mod
│   └── main/
│       ├── main.go
│       └── go.mod

1. 首先为lib包创建go.mod:

cd go/src/lib
go mod init lib

greet.go示例:

package lib

import "fmt"

func Greet() {
    fmt.Println("Hello from lib")
}

2. 构建lib包:

# 在lib目录下
go build -o lib.a
# 或者构建到指定位置
go build -o ../main/lib.a

3. 为main包创建go.mod并添加依赖:

cd go/src/main
go mod init main
# 添加本地lib依赖
go mod edit -replace lib=../lib
go mod tidy

main.go示例:

package main

import "lib"

func main() {
    lib.Greet()
}

4. 构建main程序:

# 在main目录下
go build -o mainapp

如果您想使用go tool compile/link直接操作:

# 编译lib包
cd go/src/lib
go tool compile -p lib -o lib.o greet.go

# 编译main包
cd ../main
go tool compile -I ../lib -o main.o main.go

# 链接
go tool link -L ../lib -o mainapp main.o

关键点是-p参数必须与实际包名匹配。在您的原始命令中,-p command-line-arguments导致包名不匹配,从而产生链接错误。正确的做法是使用-p lib来匹配greet.go中声明的package lib

回到顶部