为了账号安全,请及时绑定邮箱和手机立即绑定

构建简单 cgo 模块的问题

构建简单 cgo 模块的问题

Go
慕尼黑8549860 2022-10-10 20:04:21
Ubuntu。vscode 1.62.1。去1.17.3。vscode 去扩展 v0.29.0。钻研 v1.7.1。我正在尝试使用 vscode 和 vscode-go 构建一个使用 Cgo 的小应用程序。只有一个模块导入“C”。我的项目结构的根目录包含“go.mod”和“main.go”文件,并且子文件夹中有子包。我还有包含 C 工件的“include”和“lib”目录。这是我目前在 C 模块中的内容:package voltage// #cgo CFLAGS: -g -Wall -Iinclude// #cgo LDFLAGS: -Llib/linux -lvibesimple -lcurl -lssl -lvibecrypto -lvibeictk -lvibeserver// #include <stdio.h>// #include <errno.h>// #include "veapi.h"import "C"func Encrypt(datatype string, data string) (result string) {    return}func Decrypt(datatype string, data string) (result string) {    return}在“问题”视图中,它显示了以下两个问题:go list 未能返回 CompiledGoFiles。这可能表示无法执行 cgo 处理;尝试在命令行构建。请参阅https://golang.org/issue/38990。和:无法导入 C(cgo 预处理失败)(编译)我阅读了引用的问题,但我不确定如何处理这些信息。我不知道如何在这里前进。
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

C 编译器不在源目录中执行,而是在仅包含中间文件的临时目录中执行,例如编译为静态库 (.a) 的 go 文件。因此,LDFLAG-Llib/linux指向一个不存在的目录。

要解决此问题,只需将该标志替换为-L${SRCDIR}/lib/linux.

直接来自 cgo 文档:

解析 cgo 指令时,任何出现的字符串 ${SRCDIR} 都将替换为包含源文件的目录的绝对路径。这允许将预编译的静态库包含在包目录中并正确链接。

cgo 工具将始终使用包含路径中的源文件目录调用 C 编译器;即 -I${SRCDIR} 总是隐含的。


查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 166 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号