构建简单的 cgo 模块时出现问题

Problems building a simple cgo module

Ubuntu。 vscode 1.62.1。 go1.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 failed to return CompiledGoFiles. This may indicate failure to perform cgo processing; try building at the command line. See https://golang.org/issue/38990.

并且:

could not import C (cgo preprocessing failed) (compile)

我阅读了引用的问题,但不确定如何处理这些信息。

我不确定如何继续前进。

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

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

直接来自 cgo 文档:

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. This allows pre-compiled static libraries to be included in the package directory and linked properly.

The cgo tool will always invoke the C compiler with the source file's directory in the include path; i.e. -I${SRCDIR} is always implied.