2016-04-30 2608 views
1

我正在构建使用CGo的代码,此代码必须被编译为共享或静态库(静态是高度优选的)。 (code for reference转到代码编译链接器错误。我可以手动链接吗?

它在Linux和Mac上都可以正常工作,但是在Windows上它在链接器阶段失败,或者说所有4种模式(c-shared,shared,c-archive,archive)都不可用或者调用go tool link -shared手动抱怨缺少窗口的具体说明。

我的理解是,我需要建立可用lib.a是编译的一切,我会使用到的目标文件(*的.o),然后把它通过ar才能产生有效的静态库。

现在的问题是我是否可以完全跳过Go的链接器,并基于准备好的.o文件手动创建.a

如果甚至有可能,我该如何去做?

+0

你在哪里得到这些“准备好的'.o'文件”以构建成静态库?有关Windows问题的详细信息,请参阅https://github.com/golang/go/issues/11058。 – JimB

+0

@JimB当调用cgo时,.o文件来自Go本身。你可以用'-x'参数运行一个示例代码,这样它就会向你展示它正在做的所有事情,然后通过调用'go tool [tool] [arguments]''并调用' gcc [arguments]'因为这是用CGo代码去做的。 – AlexKey

+0

@JimB另外,如果你看看你链接的问题仍然存在,意味着它没有解决。但是,当我在自己的答案中编写代码时,我不得不构建Go代码的最新主分支,以便能够成功编译所有内容。 – AlexKey

回答

0

看起来像windows上的gcc无法自动发现必要的共享库。问题是由GCC造成的,而不是由Go造成的。

虽然编译转到我不得不用自编主舌尖当前版本(1.6.2)不支持共享的Windows/AMD64 /静态库。

在默认位置(C:\ Windows \ SysWOW64)手动为每个共享库(ntdll,winmm等)提供gcc已解决该问题。