gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:42:46 24 4
gpt4 key购买 nike

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

在本例中,我使用 cURL 生成一个 HTTP 请求,以便获取数据并将该数据输出到 Matlab Simulink 中。

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

我可以使用 mingw32 为 Windows 编译 libcurl.a 文件,但是当我尝试使用 mex file.cpp -L 编译 mexfile 时。 -llibcurlmex file.cpp -L。 -llibcurl -I.curl (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): 未定义对 curl_global_init 的引用'
    test.c:(.text+0xe6): 对 curl_easy_init 的 undefined reference
    test.c:(.text+0x10c): 未定义对 curl_easy_setopt 的引用'
    test.c:(.text+0x12e): 未定义对 curl_easy_setopt 的引用'
    test.c:(.text+0x150): 对 curl_easy_setopt 的 undefined reference
    test.c:(.text+0x17e): 未定义对 curl_easy_cleanup 的引用'
    test.c:(.text+0x1b3): 未定义对 curl_easy_cleanup 的引用'
    test.c:(.text+0x1db): 未定义对 curl_easy_setopt 的引用'
    test.c:(.text+0x1e7): 未定义对 curl_easy_perform 的引用'
    test.c:(.text+0x1ff): 对 curl_easy_cleanup 的 undefined reference '

  2. 一个是提到的没有这样的文件或目录:'libcurl.a.lib'

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

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

谢谢你们了:)

最佳答案

好吧,既然没有人给出新的答案,我做了更多研究,感谢@drescherjm 将我指向 Visual Studio,我能够在 Windows 上构建项目。

先决条件:

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

安装 VS 2017 后,我关注了 this文章。如果您不懂德语,以下部分适合您:

。打开你的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 文件之间的 64/32 位差异一开始让我蒙蔽,导致了另一个错误,所以请注意选择正确的文件。

。然后 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 将编译器设置为 Microsoft Visual C++ 2015 Professional 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. 瞧,您的 .mexw64 文件应该可以正确编译。 (在这种情况下,-D 标志非常重要。\builds 文件夹,你需要它们!)

谢谢大家的帮助。

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

关于c++ - mex - 在 matlab 中使用 .a 而不是带有 curl 的 .lib 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46224018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com