在 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++ > Win32 > Win32 console application
然后在向导中将类型设置为 DLL
)
由于我们使用的是 MATLAB x64,我们需要调整项目配置以生成 64 位二进制文件。从Build
菜单中,选择Configuration Manager
。从下拉菜单中选择<New>
以创建新的平台配置,选择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”?的主要内容,如果未能解决你的问题,请参考以下文章