我有一个Matlab S函数(几周前我用cURL创建了这个函数)。这只是一个例子,但足以说明我的观点。
在此示例中,我cURL
用于发出HTTP
-Request以获取数据并将该数据输出到Matlab Simulink中。
最初,我在Mac OSX上编译了此代码,在与mex
-command进行了一点努力之后,该代码仍然可以正常工作。现在,对于Windows系统,我必须再次执行相同的操作。
我可以libcurl.a
使用Windows编译文件,mingw32
但是当尝试使用mex file.cpp -L. -llibcurl
or编译mexfile时mex file.cpp -L. -llibcurl -I.curl
(curl是include文件夹,我相应地调整了#include
语句)我只得到了Matlab找不到的错误,libcurl.lib
到目前为止我没有找到查找设置以mex
使用.a
后缀。
我对C ++代码编译不太了解,所以请不要太苛刻,但是我是否错过了一些重要的事情(例如构建.lib
自身(我也没有找到任何信息,只是预编译的文件没有这样做))也可以))。
这位Matlab用户也建议更改后缀会有所帮助,不是,不是。在OSX上,将二进制文件等链接起来的编译非常简单。(有关如何执行此操作的信息,请参见GitHub Repo的自述文件),但似乎我无法全神贯注地在Windows上做同样的事情。
系统:Windows 10 64位和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'
注意,第一个错误消息不是我的,我举个例子。
因此,这里的主要问题是:有没有一种方法可以libcurl.lib
在Windows上创建文件,如果可以,如何使用Mingw32或其他编译器来创建文件?
谢谢你们已经:)
好的,由于@drescherjm将我指向Visual Studio,因此没有一个新的答案,因此我进行了更多研究,因此我能够在Windows上构建项目。
先决条件:
安装VS 2017之后,我关注了这篇文章。如果您不懂德语,那么下面的部分适合您:
我。打开您的CMD并执行
"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"
(对于32位系统)
要么
"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat"
(对于64位系统)。
.bat
-files之间的64/32位差异起初就欺骗了我,导致了另一个错误,因此请注意选择正确的文件。
二。之后,cd
转到您的cURL文件夹(curl_download_folder\winbuild
)。(您是从官方页面之前下载的)。并执行以下命令: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
三,将整个\builds
文件夹复制到包含.cpp
要编译文件的MatLab工作目录中。
III(/ 2)。如果到目前为止您还没有这样做,请将编译器设置为Microsoft Visual C++ 2015 Professional
withmex -setup cpp
或mex -setup c++
IV。sfunc.cpp
使用以下命令编译您的S函数():
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
五,瞧,你的.mexw64
-file应该正确编译。(-D
在这种情况下,标志非常重要。\builds
文件夹,您需要全部使用!)
谢谢大家的帮助。
编辑:如果您使用的是32位系统,只需将x64
答案中的每一个替换为x86
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句