目前,我有以下源码树:
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
库被 impl1
和 impl2
使用,因此 impl1.go
和 impl2.go
从以下 cgo
block 开始:
/*
#cgo CFLAGS: -I. -I${SRCDIR}/../cryptlib -L${SRCDIR}/../cryptlib -lcryptlib -Ofast
#cgo LDFLAGS: -L${SRCDIR}/../cryptlib -lcryptlib
*/
import "C"
这在尝试测试 impl1_test.go
和 impl2_test.go
时有效。
但是,当尝试运行位于 client_test.go
中的测试时,我不断收到错误消息,声称找不到 cryptlib
库。我认为这可能与 ${SRCDIR}
在这种情况下是 ./client
这使得 CFLAGS
的其余部分有关和 LDFLAGS
路径不正确(./client/../cryptolib
)。
虽然这会导致重复,但我也尝试过将 cryptlib
包含到 impl1
和 impl2
中。这种方法在尝试测试 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/