mex - 在 matlab 中使用 .a 而不是带有 curl 的 .lib 文件

mex - use .a instead of .lib file with curl in matlab

我有一个 Matlab S-Function(几周前我用 cURL 创建了这个)。这只是一个例子,但足以阐明我的观点。

在此示例中,我使用 cURL 发出 HTTP-Request 以获取数据并将该数据输出到 Matlab Simulink。

最初我在 Mac OSX 上编译了这段代码,在使用 mex-command 稍作努力后它工作正常。现在我必须再次做同样的事情,但对于 Windows 系统。

我能够使用 mingw32 为 Windows 编译 libcurl.a 文件,但是当尝试使用 mex file.cpp -L. -llibcurlmex file.cpp -L. -llibcurl -I.curl 编译 mexfile 时(curl作为包含文件夹,我相应地调整了 #include 语句)我只得到 Matlab 找不到 libcurl.lib 的错误,到目前为止我没有找到设置 mex 使用.a 后缀。

我不太了解 C++ 代码编译,所以请不要太苛刻,但我是否遗漏了一些重要的东西(比如构建 .lib 本身(我也没有找到有关的任何信息,只是预编译的文件也不起作用))。

还有这个 Matlab 用户建议更改后缀会有帮助,不,它没有。在 OSX 上,编译非常简单地链接了二进制文件等(请参阅 GitHub Repo 的自述文件,了解我是如何做到的)但似乎我无法全神贯注地做在 Windows.

上完全相同

系统:Windows 10 64 位 & Windows 7 64 位(都试过了)

错误消息:现在无法访问它,明天可能会更新,我基本上得到了两个不同的,具体取决于我使用的编译命令。

  1. 是标准(这很可能是因为我无意中没有链接头文件)

    test.c:(.text+0xe1): undefined reference to curl_global_init' test.c:(.text+0xe6): undefined reference to curl_easy_init' test.c:(.text+0x10c): undefined reference to curl_easy_setopt' test.c:(.text+0x12e): undefined reference to curl_easy_setopt' test.c:(.text+0x150): undefined reference to curl_easy_setopt' test.c:(.text+0x17e): undefined reference to curl_easy_cleanup' test.c:(.text+0x1b3): undefined reference to curl_easy_cleanup' test.c:(.text+0x1db): undefined reference to curl_easy_setopt' test.c:(.text+0x1e7): undefined reference to curl_easy_perform' test.c:(.text+0x1ff): undefined reference to curl_easy_cleanup'

  2. 一个是提到的 no such file or directory: 'libcurl.a.lib'

注意第一个错误信息不是我的,我把它举个例子

所以这里的主要问题是:有没有办法在 Windows 上创建 libcurl.lib 文件,如果可以,我该如何使用 Mingw32 或其他编译器创建它?

谢谢大家:)

好的,由于没有人给出新答案,我做了更多研究,感谢@drescherjm 将我指向 Visual Studio,我能够在 windows.[=34= 上构建项目]

先决条件:

  1. Microsoft Visual Studio 2017(社区)- .lib 编译
  2. Microsoft Visual Studio 2015(社区)- 用于 MatLab 中的 mex 编译

安装 VS 2017 后,我按照 this 文章进行了操作。如果您不懂德语,以下部分适合您:

。打开您的 CMD 并执行

"C:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Auxiliary\Build\vcvars32.bat"(对于 32 位系统)

"C:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Auxiliary\Build\vcvars64.bat"(对于 64 位系统)。

.bat 文件之间的 64/32 位差异一开始让我感到困惑,导致了另一个错误,因此请注意选择正确的文件。

II。之后 cd 到您的 cURL 文件夹 (curl_download_folder\winbuild)。 (您之前从 official page 下载的)。并执行此命令:nmake /f Makefile.vc mode=static VC=12

这会编译您在 MatLab 中 运行 cURL 所需的所有文件,并将其集成到任何其他程序中。

现在curl_download_folder\builds里面应该有一些文件夹,里面有文件。即:

  1. libcurl-vc12-x64-release-static-ipv6-ssl
  2. libcurl-vc12-x64-release-static-ipv6-ssl-obj-curl
  3. libcurl-vc12-x64-release-static-ipv6-ssl-obj-lib

III. 将整个 \builds 文件夹复制到包含要编译的 .cpp 文件的 MatLab 工作目录。

III(/2). 如果到目前为止您还没有这样做,请使用 mex -setup cpp 或 [=25] 将编译器设置为 Microsoft Visual C++ 2015 Professional =]

IV. 使用此命令编译您的 S-Function (sfunc.cpp):

mex sfunc.cpp -lbuilds\libcurl-vc12-x64-release-static-ipv6-sspi-winssl\include\ -Lbuilds\libcurl-vc12-x64-release-static-ipv6-sspi-winssl\lib\ -llibcurl_a.lib -DCURL_STATICLIB

V. 瞧,你的 .mexw64 文件应该可以正确编译。 (在这种情况下,-D 标志非常重要。\builds 个文件夹,你需要它们!)

谢谢大家的帮助。

编辑:如果您使用的是 32 位系统,只需将我的回答中的每个 x64 替换为 x86