我正在尝试在单个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
答案 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会抱怨未使用的包。