在 Visual Studio 中构建 MATLAB mex 文件会给出“函数 mexFunction 中引用的 LNK2019 未解析的外部符号 _mexPrintf”?

Posted

技术标签:

【中文标题】在 Visual Studio 中构建 MATLAB mex 文件会给出“函数 mexFunction 中引用的 LNK2019 未解析的外部符号 _mexPrintf”?【英文标题】:Building a MATLAB mex file in Visual Studio gives "LNK2019 unresolved external symbol _mexPrintf referenced in function mexFunction"? 【发布时间】:2014-10-06 16:02:29 【问题描述】:

我正在使用 Visual Studio 2012 x64 直接构建和调试 MATLAB 2014a x64 mex 文件(未在 MATLAB 中使用 mex 命令)。我按照this question 中的说明设置了一个名为test1 的Visual Studio 项目。我跟着this tutorial写了一个简单的mex文件,test1.cpp

#include <math.h>
#include <matrix.h>
#include <mex.h>

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

  mexPrintf("Hello World!\n");

构建这个解决方案给了我这个信息:

> 1>------ Build started: Project: test1, Configuration: Debug Win32
> ------ 1>     Creating library C:\PROJECTS\matlab\mex\test1\Debug\test1.lib
> and object
> C:\PROJECTS\matlab\mex\test1\Debug\test1.exp
> 1>test1.obj : error LNK2019: unresolved external symbol _mexPrintf
> referenced in function _mexFunction 1>MSVCRTD.lib(crtexe.obj) : error
> LNK2019: unresolved external symbol _main referenced in function
> ___tmainCRTStartup 1>C:\PROJECTS\matlab\mex\test1\Debug\test1.mexw64
> : fatal error LNK1120: 2 unresolved externals
> ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

这里有没有我遗漏的配置步骤?我完全使用了this answer 中的步骤,但对于较新版本的 MATLAB,它可能不完整?

【问题讨论】:

您是否将链接器搜索路径设置为libmx.lib,libmex.lib 所在的位置? @lanpa 我按照链接答案中的步骤操作,所以我 1)将 $(MATLAB_ROOT)\extern\lib\win64\microsoft; 添加到配置属性中的附加库目录 -> 链接器 -> 常规,以及 2)将 libmx.lib;libmex.lib;libmat.lib; 添加到附加配置属性 -> 链接器 -> 输入中的依赖关系。根据您的评论,我还缺少其他步骤吗? @MA:你真的按字面意思写了$(MATLAB_ROOT)吗?您应该将其替换为 MATLAB 安装根目录的完整路径 @Amro 不,我使用了C:\program files\MATLAB\R2014a$(MATLAB_ROOT) 只是我链接到的答案使用的简写。 我撤回了我的答案,因为我不确定是不是这样 :( 只是为了确认,您需要创建一个生成 DLL 的 VS 项目(常规类型,不需要 MFC)。所以转到“文件”菜单,“新建项目”,在“Visual C++ > Win32”下,选择“Win32 控制台应用程序”,然后在向导中指定“DLL”并从一个空项目开始 【参考方案1】:

您需要创建一个可生成 DLL(而不是控制台或 GUI 应用程序)的 Visual Studio 项目。 MEX 文件基本上是具有自定义扩展名的共享库(*.mexw32*.mexw64 在 Windows 上)

错误消息表明链接器找不到可执行文件的入口点函数main(),而动态库不存在该函数。

不管怎样,您可以在 MATLAB 中运行 mex -v ...,这样它就会向您显示用于调用编译器和链接器的确切命令。


编辑:

分步说明:

创建一个新的空 VS 项目来构建 DLL(Visual C++ &gt; Win32 &gt; Win32 console application 然后在向导中将类型设置为 DLL

由于我们使用的是 MATLAB x64,我们需要调整项目配置以生成 64 位二进制文​​件。从Build 菜单中,选择Configuration Manager。从下拉菜单中选择&lt;New&gt; 以创建新的平台配置,选择x64 并接受。

关注你之前提到的instructions

为 MEX 文件添加 C/C++ 源代码

#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

    plhs[0] = mxCreateString("hello world");

在“发布”模式下将平台切换到“x64”,然后构建项目。现在您应该有一个somefile.mexw64 MEX 文件,您可以在 MATLAB 中将其作为常规函数调用。

【讨论】:

以上是关于在 Visual Studio 中构建 MATLAB mex 文件会给出“函数 mexFunction 中引用的 LNK2019 未解析的外部符号 _mexPrintf”?的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 2010 中构建时锁定文件

在 Visual Studio Code 中发布构建

在 Visual Studio 中构建错误

无法在 Visual Studio 中构建汇编语言程序

在 Visual Studio 中构建完成后的 Zip 文件

如何在 Visual Studio 2017 中禁用 JavaScript 构建错误?