有没有办法在一个二进制文件中包含多个c-archive包

时间:2015-12-17 11:09:39

标签: linux go cgo

我正在尝试在单个C二进制文件中包含多个Go c-archive包,但由于每个c-archive中都包含完整的运行时,我会收到多个定义错误。

我已经尝试将多个软件包放在同一个c-archive中,但是go build不允许这样做。

我还尝试从除了一个档案之外的所有档案中删除double x; x = double.Parse("-1.54", NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture); // x will be -1.54 ,但似乎我自己的Go代码也在该目标文件中,因此不起作用,这甚至是我得到多个定义的原因而不是链接器忽略后续档案中的go.o

使用go.o代替c-shared可能会有用,但我不希望这样做,因为我必须将共享库放在我的目标机器上,这比较复杂将最终的程序二进制文件放在那里。如果可能的话,我希望所有内容都是静态链接的。

有没有办法让这个工作?如果重要的话,我可以接受只有Linux的解决方案(在这种情况下可能会有一些c-archive技巧)。

将所有内容放在一个Go包中并不是一个选项,因为它是一个相当大的代码库,并且会有不同的程序需要不同的部分。在这种情况下,它必须是一个自动生成的包。

重现问题的完整步骤:

GNU ld

1 个答案:

答案 0 :(得分:0)

在遇到你的问题后,我今天摸索了我的方式。

关键是定义一个主要的包,它导入你需要的包,并用一个“go install”命令一起构建它们。我无法通过“go build”来实现这一点。

package main //import golib

import (
        _ "golib/operations/bar"
        _ "golib/foo"
)
func main() {}
go install  -buildmode=c-archive golib

这会将.a和.h文件放在pkg / arch / golib目录下。您可以像往常一样包含.h文件,但只需要链接到golib.a

aaron@aaron-laptop:~/code/pkg/linux_amd64$ ls
github.com  golang.org  golib  golib.a
aaron@aaron-laptop:~/code/pkg/linux_amd64$ ls golib
foo.a  foo.h operations  
aaron@aaron-laptop:~/code/pkg/linux_amd64$ ls golib/operations
bar.a bar.h

请注意,如果您在导入中省略下划线,则go会抱怨未使用的包。