gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:48:02 26 4
gpt4 key购买 nike

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

我试过将多个包放在同一个 c-archive 中,但 go build 不允许这样做。

我也试过从除一个以外的所有文件中删除 go.o,但我自己的 Go 代码似乎也在该目标文件中,所以这不起作用,甚至是原因是我得到了多个定义,而不是链接器忽略了后续存档中的 go.o

使用 c-shared 代替 c-archive 可能会有效,但我不想这样做,因为我必须将共享库在我的目标机器上,这比将最终程序二进制文件放在那里要复杂得多。如果可能,我希望一切都静态链接。

有没有办法让它工作?如果这很重要,我可以接受仅限 Linux 的解决方案(在这种情况下可能有一些 GNU ld 技巧)。

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

重现问题的完整步骤:

cd $GOPATH/src
mkdir a b
cat > a/a.go <<EOT
package main

import "C"

//export a
func a() {
println("a")
}

func main() {}
EOT
cat > b/b.go <<EOT
package main

import "C"

//export b
func b() {
println("b")
}

func main() {}
EOT
cat > test.c <<EOT
#include "a.h"
#include "b.h"

int
main(int argc, char *argv[]) {
a();
b();
}
EOT
go build -buildmode=c-archive -o a.a a
go build -buildmode=c-archive -o b.a b
gcc test.c a.a b.a

最佳答案

今天遇到你的问题后,我摸索着解决了这个问题。

关键是定义一个单一的主包来导入你需要的包,并用一个“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 将提示未使用的包。

关于linux - 有没有办法在一个二进制文件中包含多个 c-archive 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34333107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com