linux - 从 Linux 库源构建 Win32 DLL

标签 linux dll winapi

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

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

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

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

在 Cygwin 上,我运行 ./configure 并卡在了这样的地方:

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

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

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

非常感谢。

最佳答案

如果您仍然坚持这一点,我可以提供一些帮助。

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

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

然后下载libsndfile .将源提取到一个目录,然后从 Cygwin bash shell 导航到该目录。有表演:

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

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

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

下一页 SRC (libsamplerate),同样的程序。

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

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

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

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

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

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

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

关于linux - 从 Linux 库源构建 Win32 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1416930/

相关文章:

linux - snmpd 未在 Ubuntu 服务器上监听端口 161

c# - 用 RAR 压缩文件

c++ - 使用win32 api绘制笛卡尔系统

linux - 远程 SUDO ssh 脚本中的 SED

linux - POSIX AIO 库和回调处理程序

c++ - 通过调用 CreateRemoteThread : crash 弹出 dll

c - QueryFullProcessImageName 因有效 HINSTANCE 失败?

c++ - OpenGL概念题

c - 如何使用 C 知道软件包是否安装在 Linux 中

C# 非托管导出不起作用