致命错误 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 上再次编译时,我收到此错误:
关闭 MATLAB 并再次打开程序即可解决问题。LINK : 致命错误 LNK1168: 无法打开 filename.mexw64 进行写入
有谁知道任何不涉及关闭 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 清理例程的地方。
我应该将cudaFree
和cudaDeviceReset
函数放在mexAtExit
上吗?在我的代码末尾调用cudaDeviceReset
是一个好习惯吗?
@Rodrigo:mexAtExit
函数应该释放在第一次运行 MEX 文件时只分配一次的所有资源。每次运行 MEX 文件时分配的资源都应该在每次运行 MEX 文件时释放,因此应该在 mexFunction
结束时释放,而不是在 mexAtExit
中。有一个使用 mexAtExit
的示例 MEX 文件,如果您在 MATLAB 命令提示符下键入:edit([matlabroot '/extern/examples/mex/mexatexit.c']);
,您会看到它。我对 CUDA 了解不多,无法推荐如何以及何时致电 cudaFree
或 cudaDeviceReset
。以上是关于致命错误 LNK1168:无法打开 filename.mexw64 进行写入的主要内容,如果未能解决你的问题,请参考以下文章
:-1: error: LNK1168: 无法打开 xxx.exe 进行写入
链接:致命错误 LNK1104:无法打开文件 'ucrt.lib'
QT :-1: error: LNK1168: 无法打开 xxx.exe 进行写入
如何解决 LINK:致命错误 LNK1181:无法打开输入文件 'vtkCommonCore-9.0.lib'