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
更多关于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。

