go - 使用 Gtk+ 的 C 接口(interface)构建 Go

标签 go compiler-errors linker cgo

我正在尝试构建一个使用外部 C 代码作为 Gtk+ 接口(interface)的 Go 程序。

这是我得到的基本 Go 代码 (ui.h.go):

package main

//#cgo pkg-config: gtk+-3.0
//#include "ui.h"
import "C"

func CInit() {
    C.Init(nil, 0)
}

func CMain() {
    C.Main()
}

func CShowWindow() {
    C.ShowWindow()
}

func main() {
    CInit()
    CShowWindow()
    CMain()
}

C代码从vala编译成目标文件(ui.o)和头文件(ui.h):

#ifndef __UI_H__
#define __UI_H__

#include <glib.h>
#include <stdlib.h>
#include <string.h>

G_BEGIN_DECLS

void ShowWindow (void);
void Init (gchar** args, int args_length1);
void Main (void);

G_END_DECLS

#endif

当我尝试 go build ui.h.go 我得到:

# command-line-arguments
/tmp/go-build916459533/command-line-arguments/_obj/ui.h.cgo2.o: In function `_cgo_80fc53cbf347_Cfunc_Init':
./ui.h.go:37: undefined reference to `Init'
/tmp/go-build916459533/command-line-arguments/_obj/ui.h.cgo2.o: In function `_cgo_80fc53cbf347_Cfunc_Main':
./ui.h.go:46: undefined reference to `Main'
/tmp/go-build916459533/command-line-arguments/_obj/ui.h.cgo2.o: In function `_cgo_80fc53cbf347_Cfunc_ShowWindow':
./ui.h.go:55: undefined reference to `ShowWindow'
collect2: error: ld returned 1 exit status

这是合乎逻辑的,我没有提供我的目标文件。但是如果我像那样在 ui.h.go 的 cgo header 中指定它...

//#cgo LDFLAGS: ui.o
//#cgo pkg-config: gtk+-3.0
//#include "ui.h"
import "C"

我收到多重定义错误,好像它被链接了两次。

# command-line-arguments
/usr/local/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
ui.o:(.bss+0x0): multiple definition of `window'
/tmp/go-link-461834384/000000.o:/home/oleg/Документы/Projects/rasp/ui.h.go:38: first defined here
ui.o: In function `ShowWindow':
ui.c:(.text+0x0): multiple definition of `ShowWindow'
/tmp/go-link-461834384/000000.o:(.text+0x25): first defined here
ui.o: In function `Init':
ui.c:(.text+0x29): multiple definition of `Init'
/tmp/go-link-461834384/000000.o:(.text+0x4e): first defined here
ui.o: In function `Main':
ui.c:(.text+0x116): multiple definition of `Main'
/tmp/go-link-461834384/000000.o:(.text+0x13b): first defined here
collect2: error: ld returned 1 exit status

如何将我的 ui.o 文件正确链接到 Go 程序? 谢谢。

最佳答案

好吧,我发现 cgo 确实与静态库链接得很好。所以我决定将我的 ui.o 存档到 libui.a 并使用 #cgo LDFLAGS: -L 链接它。 -lui 并且它工作正常。

关于go - 使用 Gtk+ 的 C 接口(interface)构建 Go,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33329744/

相关文章:

go - 包含两个以上用下划线分隔的单词的 go 包声明问题

c - 可疑的静态链接可执行文件大小

linux - 创建共享库链接器 undefined reference

java - Java-无法调用编译错误方法

c - fatal error LNK1146 : no argument specified with option '/OUT:' in VC++ Kernel

Go/Golang sql.DB 在函数中重用

json - 在 Go 中解码时输入检查 json 值

go - 无法读取JSON Cookie

ios - 编译项目时出现 Xcode 错误

swift - 为什么这个函数给我一个 "Command Failed due to signal"错误?