首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C接口构建Gtk+

用C接口构建Gtk+
EN

Stack Overflow用户
提问于 2015-10-25 12:35:46
回答 1查看 242关注 0票数 1

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

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

代码语言:javascript
复制
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()
}

从vala编译C代码到对象文件(ui.o)和头文件(ui.h):

代码语言:javascript
复制
#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时,我得到:

代码语言:javascript
复制
# 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头中这样指定它.

代码语言:javascript
复制
//#cgo LDFLAGS: ui.o
//#cgo pkg-config: gtk+-3.0
//#include "ui.h"
import "C"

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

代码语言:javascript
复制
# 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程序?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-25 12:58:58

嗯,我发现cgo和静态库有很好的联系。因此,我决定将我的ui.o归档到libui.a中,并使用#cgo LDFLAGS: -L. -lui链接它,它正常工作。

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

https://stackoverflow.com/questions/33329744

复制
相关文章

相似问题

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