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. -llibcurl
或 mex 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 位(都试过了)
错误消息:现在无法访问它,明天可能会更新,我基本上得到了两个不同的,具体取决于我使用的编译命令。
是标准(这很可能是因为我无意中没有链接头文件)
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 或其他编译器创建它?
谢谢大家:)
好的,由于没有人给出新答案,我做了更多研究,感谢@drescherjm 将我指向 Visual Studio,我能够在 windows.[=34= 上构建项目]
先决条件:
- Microsoft Visual Studio 2017(社区)- .lib 编译
- 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
里面应该有一些文件夹,里面有文件。即:
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). 如果到目前为止您还没有这样做,请使用 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
。
我有一个 Matlab S-Function(几周前我用 cURL 创建了这个)。这只是一个例子,但足以阐明我的观点。
在此示例中,我使用 cURL
发出 HTTP
-Request 以获取数据并将该数据输出到 Matlab Simulink。
最初我在 Mac OSX 上编译了这段代码,在使用 mex
-command 稍作努力后它工作正常。现在我必须再次做同样的事情,但对于 Windows 系统。
我能够使用 mingw32
为 Windows 编译 libcurl.a
文件,但是当尝试使用 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.
上完全相同系统: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'
注意第一个错误信息不是我的,我把它举个例子
所以这里的主要问题是:有没有办法在 Windows 上创建 libcurl.lib
文件,如果可以,我该如何使用 Mingw32 或其他编译器创建它?
谢谢大家:)
好的,由于没有人给出新答案,我做了更多研究,感谢@drescherjm 将我指向 Visual Studio,我能够在 windows.[=34= 上构建项目]
先决条件:
- Microsoft Visual Studio 2017(社区)- .lib 编译
- 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
里面应该有一些文件夹,里面有文件。即:
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). 如果到目前为止您还没有这样做,请使用 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
。