我试图在我的围棋程序中使用一个外部C库。
我尝试了以下几点:
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,但它看起来不像存档文件被链接。我一直收到这些:
warning: 'some_method_in_my_h_file" declared 'static' but never defined这些警告被视为错误。无论如何,它们应该在归档文件中实现,所以我搞不懂我在这里做错了什么。
当我运行go build和gun run时。
我觉得我的#cgo命令无效(我不是C专家),
发布于 2013-09-05 18:20:35
对,它不适用于ar对象归档(*.a)。你可以做两件事:
-lfoo在LDFLAGS中,libfoo.so在库搜索路径中)*.c文件本身放在Go包目录中,以便go build将它们构建并链接到但是,如果您愿意脱离标准的go build行为,则可以将*.a文件解压到各个对象文件中,然后手工模拟go build和cgo的行为。
例如,如果您使用-x选项构建了一个简单的cgo示例包,您应该会看到类似于以下内容的输出:
% 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处理的机会),您也可以手工完成这些步骤。
https://stackoverflow.com/questions/18642613
复制相似问题