Golang 中国

从PHP转过来的,所以对于编译型语言不是很了解。记得之前看C的时候,也涉及到此种文件类型。求大家赐教。

9 回复
jemygraw
#1 jemygraw • 2014-09-09 16:23

静态库文件,一般是c语言之类的编译好的库。

fising
#2 fising • 2014-09-09 17:01

@jemygraw 请问如何使用这个.a文件?

jimmykuu
#3 jimmykuu • 2014-09-09 17:06

.a文件是编译过程中生成的,每个package都会生成对应的.a文件,Go在编译的时候先判断package的源码是否有改动,如果没有的话,就不再重新编译.a文件,这样可以加快速度。

当然你可能会想到,我写了个package想卖钱,但是不想把源码给客户,是否可以直接把.a文件给他,然后把文档给他,他就直接可以用了呢。很不幸,不可以,必须有源码。所以说,.a文件对于用户来说,是没有用的,编译器用的。

joe9i0
#4 joe9i0 • 2014-09-10 17:20

@jimmykuu

有一种方案:

将要发布的闭源包.a文件放到 $GOROOT/pkg/$GOOS_$GOARCH/ 目录中.

再将发布包的源码保留只有包声明的源文件放到 $GOROOT/src/pkg/ 目录中.

操作如下:

*发布方*

例如有say包要发布:

$cd $GOPATH/src/say
$cat say.go
// say something package
package say

import "fmt"

// private function
func say(str string){
    fmt.Println(str)
}

// Say hi
func Hi(){
    say("Hi......")
}

// Say hello to someone
func Hello(me string){
    say("Hello" + me)
}

首先编译生成say包的.a文件(如果要发布到多种系统架构,需要修改编译参数交叉编译出多种发布文件)

$go install
$ls $GOPATH/pkg/$GOOS_$GOARCH/say.a

其次修改发布包对应的源文件(两种方式任选)

最简单的修改方式

$echo 'package say' > say.go

保留导出的接口与API注释供查看使用

$cat > say.go <<EOF
// say something package
package say

// Say hi
func Hi(){}

// Say hello to someone
func Hello(me string){}
EOF

最后发布方提供两份文件:

编译生成say包的.a文件和修改之后的源文件

say.a

say.go

joe9i0
#5 joe9i0 • 2014-09-10 17:21

*使用方*

复制say.a文件到$GOROOT/pkg/$GOOS_$GOARCH/目录中

复制say.go文件到$GOROOT/src/pkg/say/目录中

$cp say.a $GOROOT/pkg/$GOOS_$GOARCH/
$mkdir -p $GOROOT/src/pkg/say/
$cp say.go $GOROOT/src/pkg/say/

然后就可以在自己的代码中像使用官方标准库一样使用第三方闭源包了.

如果三方包保留了接口与API注释, 还可以直接使用godoc命令查看

$godoc say
PACKAGE DOCUMENTATION

package say
    import "say"

    say something package

FUNCTIONS

func Hi()
    Say hi

func Hello(me string)
    Say hello to someone
fising
#6 fising • 2014-09-13 19:50

@joe9i0 学习了。。。碉堡啦

golang_gc
#7 golang_gc • 2017-09-05 10:36

@joe9i0 按照你的方法显示 引用的方法没有被定义 undefined: say.Hello

yaning
#8 yaning • 2017-09-11 22:08

.a是linux上c语言的静态库文件,有对应的.h文件就能用。

songleo
#9 songleo • 2018-05-09 11:04
需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。