致命错误 LNK1168:无法打开 filename.mexw64 进行写入

Posted

技术标签:

【中文标题】致命错误 LNK1168:无法打开 filename.mexw64 进行写入【英文标题】:Fatal error LNK1168: cannot open filename.mexw64 for writing 【发布时间】:2019-09-25 10:50:10 【问题描述】:

我正在用 Visual Studio 2015 编写一个 c++/CUDA 代码来生成一个 mex 文件以与 MATLAB 集成。

当我通过 MATLAB 控制台运行 mex 文件,然后尝试在 VS 上再次编译时,我收到此错误:

LINK : 致命错误 LNK1168: 无法打开 filename.mexw64 进行写入

关闭 MATLAB 并再次打开程序即可解决问题。

有谁知道任何不涉及关闭 MATLAB 的解决方案?

【问题讨论】:

【参考方案1】:

MEX 文件是 DLL(在 Windows 上,在其他系统上是共享对象)。首次运行时,MATLAB 会链接到它们,但除非明确告知(或退出 MATLAB),否则不会取消链接。

打字

clear mex

在 MATLAB 中将取消链接所有 MEX 文件。见the relevant documentation。

但请注意,您的 MEX 文件可以调用mxLock,这将导致它被锁定在内存中,然后clear mex 不会清除它。如果您在 MEX 文件中使用此函数,则需要包含一个工具以使您的 MEX 文件调用 mxUnlock。我通常添加诸如mymexfile --unlock 之类的语法:MEX 文件检查它是否使用一个参数调用,并且该参数是一个字符串,并且该字符串与“--unlock”匹配,然后它调用mxUnlock

【讨论】:

如果我运行 .mex 文件然后输入 clear mex,MATLAB 停止工作。解决这个问题的方法是执行 reset(gpuDevice(1)) 然后在它之后,命令 clear mex 一直工作正常。 @RodrigoVimieiro:您可能需要使用 mexAtExit 在 MEX 文件中指定清理功能。此函数需要释放您在 MEX 文件中分配的所有资源,并且是放置 GPU 清理例程的地方。 我应该将cudaFreecudaDeviceReset 函数放在mexAtExit 上吗?在我的代码末尾调用cudaDeviceReset 是一个好习惯吗? @Rodrigo:mexAtExit 函数应该释放在第一次运行 MEX 文件时只分配一次的所有资源。每次运行 MEX 文件时分配的资源都应该在每次运行 MEX 文件时释放,因此应该在 mexFunction 结束时释放,而不是在 mexAtExit 中。有一个使用 mexAtExit 的示例 MEX 文件,如果您在 MATLAB 命令提示符下键入:edit([matlabroot '/extern/examples/mex/mexatexit.c']);,您会看到它。我对 CUDA 了解不多,无法推荐如何以及何时致电 cudaFreecudaDeviceReset

以上是关于致命错误 LNK1168:无法打开 filename.mexw64 进行写入的主要内容,如果未能解决你的问题,请参考以下文章

:-1: error: LNK1168: 无法打开 xxx.exe 进行写入

链接:致命错误 LNK1104:无法打开文件 'ucrt.lib'

QT :-1: error: LNK1168: 无法打开 xxx.exe 进行写入

如何解决 LINK:致命错误 LNK1181:无法打开输入文件 'vtkCommonCore-9.0.lib'

如何摆脱VS 13中的错误“链接:致命错误LNK1104:无法打开文件'LIBC.lib'”?

链接:致命错误 LNK1104:无法打开文件“SDL.lib”