2013-09-05 63 views
1

我试图在Go程序中使用外部C库。Cgo包含档案.a文件

我曾尝试以下:

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文件(I检查使用ar命令),具有定义的功能是在.h文件中。

似乎.h文件链接正常,但它看起来不像档案文件正在链接。我不断收到这些:

warning: 'some_method_in_my_h_file" declared 'static' but never defined 

而且这些警告被视为错误。无论如何,他们应该在档案文件中实施,所以我很困惑我在这里做错了什么。我运行go buildgun run

我有一种感觉,我#cgo命令是无效的(我不是C专家),

+0

你可以添加函数定义/声明吗?如果声明的声明是静态的,它们应该在声明的文件中定义和使用。函数定义中的'static'告诉编译器不要将函数导出到文件外部。 – tomahh

回答

2

正确的,它不与AR对象档案工作(*.a)。有两件事情可以做:

  • 链接它作为(在库搜索路径-lfooLDFLAGS,与libfoo.so)的共享库

  • *.c文件本身转到包目录中,使go build建立和如果你愿意出去标准go build行为的链接他们

,不过,你可以*.a文件解压缩到各个目标文件中,然后手动模拟go buildcgo的行为。

例如,如果你建立一个微不足道的CGO样品封装与-x选项,你会看到类似这样的输出:

% 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-specific ar存档,然后通过6l链接。如果由于某些原因,您确实无法将*.c文件放在软件包目录中,并让go build为您处理它们(这会简单得多,并为您的软件包提供go get的机会),您也可以手动执行这些步骤。 。

+0

我实际上在.a文件的相同目录中有一个.o文件列表。有没有办法让我把它们全部链接起来? – K2xL

+0

这是可能的。我会回答以上以获得更多空间。 –

+0

当你说包目录...我把它们放在pkg目录下,但是当我使用-x时它似乎没有列出它们。我的pkg目录是否需要进入路径或去env或什么? – K2xL