首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cgo包括存档.a文件

Cgo包括存档.a文件
EN

Stack Overflow用户
提问于 2013-09-05 17:38:19
回答 1查看 1.7K关注 0票数 1

我试图在我的围棋程序中使用一个外部C库。

我尝试了以下几点:

代码语言:javascript
复制
package cgoexample

/*
#include <stdio.h>
#include <stdlib.h>

#cgo CFLAGS: -I/Users/me/somelib/include 
#cgo LDFLAGS: /Users/me/somelib/libhello.a
#include "stinger.h"
void myprint(char* s) {
        printf("%s", s);
}
*/
import "C"

import "unsafe"
//... more here

/Users/me/somelib/include中有.h文件,在libhello.a中有.o文件(我使用ar命令检查),它具有在.h文件中定义的函数。

看起来.h文件是链接的OK,但它看起来不像存档文件被链接。我一直收到这些:

代码语言:javascript
复制
warning: 'some_method_in_my_h_file" declared 'static' but never defined

这些警告被视为错误。无论如何,它们应该在归档文件中实现,所以我搞不懂我在这里做错了什么。

当我运行go buildgun run时。

我觉得我的#cgo命令无效(我不是C专家),

EN

回答 1

Stack Overflow用户

发布于 2013-09-05 18:20:35

对,它不适用于ar对象归档(*.a)。你可以做两件事:

  • 将其链接为共享库(-lfooLDFLAGS中,libfoo.so在库搜索路径中)
  • *.c文件本身放在Go包目录中,以便go build将它们构建并链接到

但是,如果您愿意脱离标准的go build行为,则可以将*.a文件解压到各个对象文件中,然后手工模拟go buildcgo的行为。

例如,如果您使用-x选项构建了一个简单的cgo示例包,您应该会看到类似于以下内容的输出:

代码语言:javascript
复制
% go build -x
(...)
.../cgo (...) sample.go
(...)
gcc -I . -g (...) -o $WORK/.../_obj/sample.o -c ./sample.c
(...)
gcc -I . -g (...) -o $WORK/.../_obj/_all.o (...) $WORK/.../_obj/sample.o
(...)
.../pack grcP $WORK $WORK/.../sample.a (...) .../_obj/_all.o
cd .
.../6l -o $WORK/.../a.out (...) $WORK/.../sample.a
(...)

因此,您可以看到单个*.c文件正在由gcc编译,打包到一个特定于Go的ar存档中,然后由6l链接。如果由于某些原因,您确实无法将*.c文件放在包目录中并让go build为您处理这些文件(这将使您的包更加简单,并给人们提供对包进行go get处理的机会),您也可以手工完成这些步骤。

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

https://stackoverflow.com/questions/18642613

复制
相关文章

相似问题

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