目前,我有以下源码树:
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.gocryptlib库由impl1和impl2使用,因此,impl1.go和impl2.go都以以下cgo块开头:
/*
#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)。
虽然这会导致重复,但我也尝试过在impl1和impl2中包含cryptlib。这种方法在尝试测试client_test.go时也会导致问题,因为组合的二进制文件现在可以看到在cryptlib中定义的相同函数的多个实例。
我应该如何正确地构造我的源树和cgo标志,以便我的所有.go源文件都可以找到我的cryptlib库并进行编译?
发布于 2018-03-22 21:09:10
来自cgo Godocs:
解析cgo指令时,字符串${SRCDIR}的任何匹配项都将替换为包含源文件的目录的绝对路径。
因此,对于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即可。
https://stackoverflow.com/questions/48999361
复制相似问题