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

标签 go cgo

目前,我有以下源码树:

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/

相关文章:

go - 从共享库访问函数时出现内存不足 panic

go - C char name[8] 到 GoLang Name [8]byte

go - 在Go中多次洗牌

go - 转义字符串中的 '.' 字符

java - Go JNI异常0xc0000005信号在外部代码执行期间到达

c++ - 是否可以在nodejs或golang中使用Visual C++ MFC函数插件?

go - 在Go应用程序中使用默认凭据时出现GCP权限问题

performance - 在Protobuf中将Go结构编码为映射键的最有效方法

docker - 在 Docker 中,无法 cd 进入安装了 "go get"的目录?

go - 如何将 C.double 数组传递给 Cgo 函数?