英文:
Problems building a simple cgo module
问题
Ubuntu. vscode 1.62.1. go1.17.3. vscode go extension v0.29.0. delve 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
}
在"Problems"视图中,显示了以下两个问题:
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)
我阅读了引用的问题,但我不确定如何处理这些信息。
我不确定如何继续下一步。
英文:
Ubuntu. vscode 1.62.1. go1.17.3. vscode go extension v0.29.0. delve v1.7.1.
I'm trying to a build a small app that uses Cgo, using vscode and vscode-go. Only one module imports "C".
My project structure has the root directory containing the "go.mod" and "main.go" files, and I have subpackages in subfolders. I also have "include" and "lib" directories that contain the C artifacts.
This is what I have so far in the C module:
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
}
In the "Problems" view, it shows the following two issues:
> 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.
And:
> could not import C (cgo preprocessing failed) (compile)
I read the cited issue, but I'm not sure what to do with that information.
I'm not sure how to move forward here.
答案1
得分: 4
C编译器不在源目录中执行,而是在一个临时目录中执行,该目录仅包含中间文件,例如将您的go文件编译为静态库(.a)。因此,LDFLAG“-Llib/linux”指向一个不存在的目录。
要解决此问题,只需将该标志替换为“-L${SRCDIR}/lib/linux”。
直接从cgo文档中摘录:
> 解析cgo指令时,任何出现的字符串${SRCDIR}都将被替换为包含源文件的目录的绝对路径。这允许将预编译的静态库包含在包目录中并正确链接。
> cgo工具将始终在包含路径中使用源文件的目录;即-I${SRCDIR}始终被隐含。
英文:
The C compiler is not executed in the source directory but in a temporary directory only containing intermediate files, such as your go files compiled as static libraries (.a). Therefore, the LDFLAG -Llib/linux
points to an unexisting directory.
To solve this issue, just replace that flag with -L${SRCDIR}/lib/linux
.
Directly from the cgo docs:
> 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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论