gpt4 book ai didi

go - 在 Golang 项目中正确包含 C 库(按源代码)

转载 作者:数据小太阳 更新时间:2023-10-29 03:23:24 24 4
gpt4 key购买 nike

目前,我有以下源码树:

client
|
|--cryptlib
| |
| |--cryptlib.so
| |--cryptlib.a
| |--<C sources>
| |--Makefile
|
|--impl1
| |--<C sources>
| |--impl1.go
| |--impl1_test.go
|
|--impl2
| |--<C sources>
| |--impl2.go
| |--impl1_test.go
|
|--client.go
|--client_test.go

cryptlib 库被 impl1impl2 使用,因此 impl1.goimpl2.go 从以下 cgo block 开始:

/*
#cgo CFLAGS: -I. -I${SRCDIR}/../cryptlib -L${SRCDIR}/../cryptlib -lcryptlib -Ofast
#cgo LDFLAGS: -L${SRCDIR}/../cryptlib -lcryptlib
*/
import "C"

这在尝试测试 impl1_test.goimpl2_test.go 时有效。

但是,当尝试运行位于 client_test.go 中的测试时,我不断收到错误消息,声称找不到 cryptlib 库。我认为这可能与 ${SRCDIR} 在这种情况下是 ./client 这使得 CFLAGS 的其余部分有关和 LDFLAGS 路径不正确(./client/../cryptolib)。

虽然这会导致重复,但我也尝试过将 cryptlib 包含到 impl1impl2 中。这种方法在尝试测试 client_test.go 时再次导致问题,因为组合的二进制文件现在可以看到 cryptlib 中定义的相同函数的多个实例。

我应该如何正确构建我的源代码树和 cgo 标志,以便我所有的 .go 源文件都能找到我的 cryptlib 库并编译?

最佳答案

来自 cgo Godocs:

When the cgo directives are parsed, any occurrence of the string ${SRCDIR} will be replaced by the absolute path to the directory containing the source file.

所以对于 client_test 来说,SRCDIR 是一个更高的目录级别,因此它的 CGO 指令应该如下所示:

/*
#cgo CFLAGS: -I. -I${SRCDIR}/cryptlib -L${SRCDIR}/cryptlib -lcryptlib -Ofast
#cgo LDFLAGS: -L${SRCDIR}/cryptlib -lcryptlib
*/

至于另一种方法,我通常做的是在系统库目录/usr/lib/ 中安装C 库。这样我就不需要担心相对引用,只需使用 -lcryptlib

关于go - 在 Golang 项目中正确包含 C 库(按源代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48999361/

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