首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Golang项目中适当地包含C库(通过源代码)

在Golang项目中适当地包含C库(通过源代码)
EN

Stack Overflow用户
提问于 2018-02-27 08:37:54
回答 1查看 454关注 0票数 0

目前,我有以下源码树:

代码语言:javascript
复制
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块开头:

代码语言:javascript
复制
/*
#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的事实有关,这使得其余的CFLAGSLDFLAGS路径不正确(./client/../cryptolib)。

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

我应该如何正确地构造我的源树和cgo标志,以便我的所有.go源文件都可以找到我的cryptlib库并进行编译?

EN

回答 1

Stack Overflow用户

发布于 2018-03-22 21:09:10

来自cgo Godocs:

解析cgo指令时,字符串${SRCDIR}的任何匹配项都将替换为包含源文件的目录的绝对路径。

因此,对于client_testSRCDIR是一个更高的目录级,因此它的CGO指令应该如下所示:

代码语言:javascript
复制
/*
#cgo CFLAGS: -I. -I${SRCDIR}/cryptlib -L${SRCDIR}/cryptlib -lcryptlib -Ofast 
#cgo LDFLAGS: -L${SRCDIR}/cryptlib -lcryptlib
*/

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48999361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档