- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试构建一个使用 TagLib 的 Go 包,而且我在弄清楚如何将已编译的库与 cgo 一起使用时遇到了一些麻烦。
我编译了TagLib,在中吐出了
目录。 bindings 目录中还有 tag.dll
、tag.exp
、tag.lib
>taglibtaglib_c.*
二进制文件,但我假设我只是忽略了它们。
如何使用已编译的库与 Go 一起使用?我在 OS X 上的项目的源代码中设置了所有内容,但是我需要做什么才能在 Windows 上编译它?编译后的库(dll 或静态库?)是否必须与源代码位于同一目录中?标题呢?
最佳答案
不幸的是,我没有可用的 Windows 机器来亲自尝试,但理论上,这应该可行。我列出的步骤是从 unix 角度编写的,但除非另有说明,否则它应该可以直接转换为 Windows。对于 Windows,我喜欢使用 GitBash对于我的终端,因为它带有一些有用的 unix 工具。
无论如何,我会检查整个过程以确保我没有做出任何假设。首先,我们将从下载和安装 taglib 开始。假设您下载了 1.8 tarball他们可用,然后我会将其安装在本地计算机的某个文件夹中:
/home/noj $ mkdir -p clibs/src
/home/noj $ cd clibs/src
/home/noj/clibs/src $ tar -xvf /home/noj/Downloads/
/home/noj/clibs/src $ cd taglib-1.8
/home/noj/clibs/src/taglib-1.8 $ cmake -DCMAKE_INSTALL_PREFIX=/home/noj/clibs -DCMAKE_RELEASE_TYPE=Release .
/home/noj/clibs/src/taglib $ make
/home/noj/clibs/src/taglib $ make install
以上代码应该在文件夹/home/noj/clibs
中本地安装用于开发的taglib。如果查看文件夹的内部,您会发现 bin
、lib
和 include
的子目录。
所以这是时髦的部分。 Windows 标准是将动态库文件(*.dll
)转储到bin
目录中。一些开放源代码库坚持这样做并这样做,其他人仍然将 *.dll
文件转储到 lib
目录中,因为这是它们在 Unix 系统中通常去的地方。您需要查看安装生成的 lib
目录,并将生成的任何 *.dll
文件复制到 bin
目录以确保在没有太多 hackery 的情况下进行正确的链接。
现在是源代码!在源代码的顶部,您需要包含 cgo
元注释来告诉 Go 在哪里搜索您想要的库,以及它们的 header (include
安装时生成的目录)。这是一些尝试使用我们刚刚在上面构建的库的 Go 源代码:
package main
/*
#cgo LDFLAGS: -L/home/noj/clibs/lib -ltag -lstdc++
#cgo CFLAGS: -I/home/noj/clibs/include/taglib
#include <taglib.h>
*/
import "C"
import (
// normal imports
// ...
)
func main() {
// ...
}
现在,Windows 还要求您将您的 *.dll
文件所在的目录添加到您的 PATH
,因此我们将继续这样做。 .
/home/noj $ export PATH=$PATH:/home/noj/clibs/bin
现在我们应该准备好在 Go 的源目录中使用 go build
正常编译代码。
可能的问题:
因此您可能遇到的一些问题是发现您没有必要的库来在 Windows 中构建 taglib,尽管听起来您已经构建了它,所以这应该没问题。您会注意到,在 go 源代码中,我为标准 c++ 库添加了 LDFLAG
。这是因为 taglib 使用 C++。如果这证明是一个问题,我会创建一个简单的 C 程序和你的 go 代码,它与 c++ 库接口(interface)并为它创建一个 C 接口(interface)。根据我的经验,使用 C 库和 Go 比使用 C++ 和 Go 更容易。
关于windows - 将 Windows 库与 cgo 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16492121/
我试图使用 cgo 为 x264 库编写一个小包装器,但遇到了嵌套结构的问题。该库使用了许多复杂的结构,其中一些字段本身就是匿名结构。 当尝试使用 cgo 访问这些结构时,我遇到了编译错误,因为 go
我正在使用一个 C 库,与下面不同,我无法控制它。我需要将指向也包含指针的数组的指针传递给 C 函数。 package main /* #include typedef int* pInt; voi
根据 CGO 的文档( https://pkg.go.dev/cmd/cgo ),在实现中有一个已知的错误: Note: the current implementation has a bug. W
我正在尝试使用 CGO 将现有的 Go 包构建到 C 共享库和 header 中. 我用 -buildmode c-shared 构建了这个包如记录。 -buildmode=c-shared
C部分: struct Person {...} struct Person * get_team(int * n) 转到部分: n := C.int(0) var team *C.struct_Pe
我在ubuntu 18上使用go版本go版本“go1.14.4 linux / amd64”。该代码不是我编写的,但我认为它可以与比当前版本早几年的go版本一起使用。当我尝试构建时,出现此错误。有什么
我编写了一个 Go 程序来模拟按键操作。为此,我必须使用 cgo 和不同的 C 代码片段,具体取决于正在编译 Go 代码的操作系统。我编写的代码如下所示: package keyboard /* #i
我已经在 Linux 中围绕信号量函数编写了一个包装器。这在过去的 Go 1.3 和 Go 1.4 上对我有用,但我需要使用这个包装器重建我的应用程序,它不再使用 Go 1.6.2 或 Go 1.7r
关注我的 earlier question ,现在我在尝试执行此 article 中的所有相同步骤时遇到此错误,因为我已经从 Go 1.6.1 升级到 Go 1.7.1(我无法返回到 Go 1.6.1
有时,C API 可能需要 NULL 指针。 这在 CGO 中可能吗? 例如,我想在 Go 语言程序中向 strcmp() 传递一个 null 参数: package strutil /* #incl
我正在使用 native linux C 二进制文件,它有一个相当昂贵的初始化调用,我想在应用程序启动时执行一次。这个调用应该在内部打开一堆文件句柄供以后使用。当我从 Go 调用这个昂贵的初始化 C
我正在使用这个库 https://github.com/billziss-gh/cgofuse ,还有一些接口(interface)需要实现,其中一个看起来像这样: func (self *Memfs
似乎我不能使用 Cgo 调用在另一个目录而不是当前 Go 包中声明的 C 函数。 所有文件的代码: // TestGoCallOC.go package main /* #include "test.
去项目结构 src test.go testc/collection/linkedlist.h testc/collection/linkedlist.c test.go package
我正在用 Go 编写一个库,我正在使用 CGo 将其编译为 native 库,但是当导出函数时,它们在函数声明和文档注释之间有这个烦人的空行。 例如,假设我的 go 文件中有这个 /** * Pri
为什么使用 Cgo 时我的 .go 文件中无法识别 c 函数? 我遵循了所有过程并尝试了 godoc 上的示例,它有效但这个不起作用,是什么原因? 文件夹结构 libsha.a sha.cpp 扫码
我正在用 cgo 包装一个 C 库,以供普通 Go 代码使用。 我的问题是我想将错误字符串向上传播到 Go API,但是有问题的 C 库通过线程本地存储提供错误字符串;有一个全局 get_error(
我有点乱,我看不出我是怎么摆脱它的……我得到了什么:* 我使用 cgo 构建的库 (dll)。* 使用此库 (dll) 的 C++ 应用程序。 我要做什么:我尝试释放在 C++ 应用程序的 cgo 库
我正在用 Go 编写一个库,我想导出到一个 c-shared-library。它工作得很好,但是我发现导出的 header 使用 p0、p1、p2、 有点烦人…… 用于参数名称,而不是 Go 中的原始
我目前正在开发一个程序,该程序使用带有 cgo 的 c 库调用长时间运行的函数。我无法使用 c 编辑库以允许超时。到目前为止,我唯一的解决方案是让僵尸 goroutine 继续运行 func Time
我是一名优秀的程序员,十分优秀!