【问题标题】:Building a Win32 DLL from a Linux library source从 Linux 库源构建 Win32 DLL
【发布时间】:2010-11-27 20:45:51
【问题描述】:

我正在尝试从与音频 DSP 相关的 Linux 库 (http://breakfastquay.com/rubberband/) 构建 Win32 DLL。有适用于 Linux 的 makefile 和配置脚本,但没有适用于 Windows 的帮助。作者提供了一个使用该库的示例应用程序的 Win32 二进制文件,我看到一些“#ifdef MSVC”和“#ifdef WIN32”散落在各处,所以我认为我并不是完全从头开始,但我尽管如此,我还是卡住了。

由于我在这两个平台上的编程知识都相当有限,我将不胜感激。

首先,从这里开始的正确方法是什么?视觉工作室?赛格温?最初我开始在 Visual Studio 中创建一个 Win32 DLL 项目,添加源文件,考虑添加一个 .def 文件等,但在某些时候我觉得这无济于事。

至于 Cygwin,这是第一次使用它,我什至不知道这是否是 Cygwin 设计的那种东西。是吗?

在 Cygwin 上,我运行了 ./configure 并遇到了这样的问题:

“正在检查 SRC...配置:错误:未满足包要求(采样率):未找到包“采样率””

查看日志后,pkg-config 似乎正在寻找 samplerate.pc。如何在 Windows 中处理包? libsamplerate 只是一个开源库,我有源代码和一个 DLL。但我不确定如何使用它们来满足 librubberband 的依赖要求(这是我正在尝试构建的)

在这一点上我完全迷失了,如果有人可以在正确的方向上轻推我......还有,有没有更简单的方法来做到这一点?

非常感谢。

【问题讨论】:

  • 对于采样率,您可能需要自己构建它。按照下面的答案构建和安装它会安装正确的 samplerate.pc 文件。您可能需要为多个依赖项执行此操作。

标签: linux dll winapi


【解决方案1】:

如果你仍然坚持这一点,我可以稍微说明一下。

您可能必须从源代码构建所有内容(或在您的环境中安装库)。您使用的是 Cygwin,我也推荐 MinGW 和 MSYS,但有时无法使用这种组合来构建程序或库。

因此,如果使用 Cygwin,首先确保您安装了正确的环境。这是您安装了正确的开发头文件。

然后下载libsndfile。将源代码提取到一个目录,然后从 Cygwin bash shell 导航到该目录。有执行:

./configure
make
make install prefix=/cygdrive/c/cygwin

请注意,我使用了前缀,该前缀应指向安装 Cygwin 的目录,以便正确安装库(MinGW 和 MSYS 也是如此,前缀应指向 MinGW 安装目录)。也许在前缀中使用usr 目录也可以,我从未尝试过。

现在下载 FFTW,因为 libsamplerate 和橡皮筋需要它。与 libsndfile 相同的过程:使用前缀提取、配置、制作和制作安装。现在将 FFTW 的头文件(在示例中位于 /cygdrive/c/cygwin/include 中)复制到 usr 目录中的 include 目录中(在示例中为 /cygdrive/c/cygwin/usr/include)。

下一个SRC (libsamplerate),同样的过程。

然后是Vamp plugin SDK。为了编译它,您可能需要编辑文件src\vamp-hostsdk\PluginLoader.cpp,从dlopen() 调用中删除RTLD_LOCAL(这是安全的,它已经是默认行为)。

另外,您可能需要手动安装它(根据我的经验,它不喜欢前缀)。或者设置环境变量PKG_CONFIG_PATH指向pkgconfig的路径,例如:

set PKG_CONFIG_PATH=/cygdrive/c/cygwin/lib/pkgconfig:/usr/local/lib/pkgconfig

现在,使用LADSPA header 的内容在包含目录中创建一个名为ladspa.h 的文件

最后,配置和构建橡皮筋,它应该找到它需要的一切。

要使用 MinGW 构建 MSYS,请遵循相同的过程,使用相应的前缀。使用 Visual Studio 是另一种选择,但您可能需要使用一些预构建的库(例如 libsndfile),因为在 Windows 中本地构建 Linux 库在 VS 中可能很复杂甚至不可能(无需破解源代码)。

无论如何,橡皮筋的作者提供二进制文件;我认为你应该考虑使用它们而不是经历所有这些。

【讨论】:

  • 感谢您的详细回复。事实上,我仍然被困住了。我最终确实让它在 VS 中编译,但链接它不起作用。我可能不得不再走一个大弯路,让它在 MinGW 或 Cygwin 中工作......我不能首先使用作者提供的二进制文件,因为这只是一个使用二进制文件的简单示例应用程序,而不是二进制文件图书馆本身(如果我错了,请纠正我);否则我会非常乐意放弃所有这些麻烦。无论如何,感谢您的回答。我得试试这个。
  • 我不知道你最终是否会看到这个,但我认为在我开始工作之前我只剩下一个障碍。我在 MinGW/MSYS 上,并整理了 linbsndfile、libsamplerate、fftw3 和 vamp。但 librubberband 似乎也需要 pthreads 库。这里有什么解决方案?安装 pthreads-win32?是否有任何适合新手的指南来安装 pthreads-win32,因为我找不到一个。听起来您以前已经这样做过,所以也许您对此有所了解。再次感谢!
  • 嗯...是的,我已经在 Cygwin 环境中完成了它(你一开始工作的地方),所以 pthreads 已经可用。对于 MinGW,您有 2 个选择,或者自己编译 pthreads-win32(您可以在此处获取包:sourceforge.net/projects/mingw/files 查看 GCC4 当前版本文件)或使用已编译的库。您也可以在“外部二进制包”下的源代码或此处的 sourceforge.net/projects/mingw-w64/files 中找到它。让我知道其他任何事情:)
  • 我实际上选择完全不使用 pthreads(原因是,README 文件表明 pthreads 在 Win32 上不是必需的)并尝试我的黑客攻击。我认为结果很好。只需将 '#define _Win32' 添加到 Thread.h 并删除 Makefile LDFLAGS 中的 -lpthread ,它就可以正常编译/链接。它构建了有效的 /bin/rubberband.exe。我还没有在我的应用程序中使用 .dll,但是,嘿,我在为自己走到这一步而自责(无知会导致低期望……)!再次感谢您在这方面的帮助;我不认为我会在这里谷歌搜索。
  • 出于好奇,有没有人在阅读本文时创建了橡皮筋库的工作 Windows DLL?更好的是,一个在 MSVC 中编译的?如果有一些开源项目设置了项目定义,我很乐意避免自己遇到麻烦;-)
【解决方案2】:

Linux 到 w32 主要是一件棘手的事情。
对于每个依赖项,下载源代码并:

./configure
make
sudo make install

另外,我建议您使用 MinGW + msys 代替 CygWin(因为后者生成依赖于其库的可执行文件)。但是,在您的情况下,请使用 VS 方法——这会为您节省大量时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2011-02-08
    • 2020-08-20
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    相关资源
    最近更新 更多