mex - 在matlab

时间:2017-09-14 16:18:44

标签: c++ matlab curl mingw32

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

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

最初我在Mac OSX上编译了这段代码,在使用mex - 命令进行了一些努力后,它运行良好。现在我必须再次这样做,但对于Windows系统。

我可以使用libcurl.a编译Windows的mingw32文件,但在尝试使用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上做同样的事情。< / p>

系统:Windows 10 64位&amp; 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'
  3. 请注意,第一条错误消息不是我的,我提供了一个示例

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

    非常感谢你们:)

1 个答案:

答案 0 :(得分:0)

好的,所以既然没有一个新的答案我做了更多的研究,感谢@drescherjm指向我的Visual Studio,我能够在Windows上构建项目。

先决条件:

  1. Microsoft Visual Studio 2017(社区) - 用于.lib编译
  2. Microsoft Visual Studio 2015(社区) - 用于MatLab中的mex编译
  3. 安装VS 2017后,我跟着this文章。如果您不懂德语,以下部分适合您:

    <强> I 即可。打开CMD并执行

    "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"(适用于32位系统)

    OR

    "C:\Program Files (x86)\Microsoft Visual Studio\2017\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
    4. III。将整个\builds文件夹复制到包含要编译的.cpp文件的MatLab工作目录。

      III(/ 2)。如果到目前为止没有这样做,请将编译器设置为Microsoft Visual C++ 2015 Professional mex -setup cppmex -setup c++

      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。Voilà,您的.mexw64 - 文件应该正确编译。 (-D标志在这种情况下非常重要。\builds文件夹,你需要它们!)

      感谢大家的帮助。

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