我有一个Matlab S-Function(几个星期前我用cURL创建了这个)。这只是一个例子,但这足以说明我的观点。
在此示例中,我使用cURL
创建HTTP
- 请求以获取数据并将该数据输出到Matlab Simulink中。
最初我在Mac OSX上编译了这段代码,在使用mex
- 命令进行了一些努力后,它运行良好。现在我必须再次这样做,但对于Windows系统。
我可以使用libcurl.a
编译Windows的mingw32
文件,但在尝试使用mex file.cpp -L. -llibcurl
或mex 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位(试过)
错误消息:现在无法访问它,明天可能会更新,我基本上有两种不同,具体取决于我用来编译的命令。
是标准(很可能是因为我没有无意中链接头文件而出现)
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'
no such file or directory: 'libcurl.a.lib'
请注意,第一条错误消息不是我的,我提供了一个示例
所以这里的主要问题是:有没有办法在Windows上创建libcurl.lib
文件,如果是,我该如何使用Mingw32或其他编译器?
非常感谢你们:)
答案 0 :(得分:0)
好的,所以既然没有一个新的答案我做了更多的研究,感谢@drescherjm指向我的Visual Studio,我能够在Windows上构建项目。
先决条件:
安装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
内应该有一些包含文件的文件夹。即:
libcurl-vc12-x64-release-static-ipv6-ssl
libcurl-vc12-x64-release-static-ipv6-ssl-obj-curl
libcurl-vc12-x64-release-static-ipv6-ssl-obj-lib
III。将整个\builds
文件夹复制到包含要编译的.cpp
文件的MatLab工作目录。
III(/ 2)。如果到目前为止没有这样做,请将编译器设置为Microsoft Visual C++ 2015 Professional
mex -setup cpp
或mex -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
即可。