设置: Windows 7 企业版。Matlab 7.10.0 (R2010a)。mcc 编译器:Microsoft Visual C++ 2008 Express。
发生了什么: 我的项目在通过 Matlab 运行时运行良好,但是在使用 mcc 编译后尝试通过命令提示符运行 .exe 时,命令提示符会产生错误。我发出的 mcc 命令是:
mcc -m -v STARTUP1.m -o EXE_REDUC
我在命令提示符中收到的错误是:
??? Error using ==> textscan
Invalid file identifier. Use fopen to generate a valid file identifier.
我有一个名为 LoadXLS.m 的文件,它使用以下方法加载和读取 .csv 文件:
fid = fopen(file,'r');
temp_data = textscan(fid,...args...);
然后我处理 temp_data。
我尝试加载的 csv 文件称为 spec.csv。它位于我存储 STARTUP1.m 的两个目录下方。STARTUP1.m的位置也是mcc生成的文件存放的地方。我已经使用 pathtool 来“添加子文件夹”这个位置,但我知道这些位置在编译时不会转移到 mbuild。
我已经尝试过: 我已经进入并添加了打印语句来打印 fid 的值,以确保它是有效的。当我在 Matlab 中运行它时,它有一个有效值,但是当我在命令提示符下运行它时,它总是返回一个无效值 -1。
我已经删除了所有 addpath() 调用,我尝试使用以下命令将 STARTUP1.m 目录添加到 mcc ctf 存档:
mcc -m -v -a 'C:\Users\...path...\STARTUP1.m_location' STARTUP1.m -o EXE_REDUC;
但是,当我这样做时,在命令提示符下运行时会出现不同的错误:
Cannot open CTF archive file
'C:\...path...\AppData\Local\Temp\mathworks_tmp_7532_28296'
or
'C:\...path...\AppData\Local\Temp\mathworks_tmp_7532_28296.zip'
??? Undefined function or variable 'matlabrc'.
为了解决这个问题,我尝试添加编译指示
%#function matlabrc
到 STARTUP1.m 的顶部尝试并强制其包含,但没有成功。
我还将 spec.csv 文件复制到 ctfroot 中的新目录并更改
fid = fopen(...)
至:
[tempFile, message] = fopen(fullfile(ctfroot, 'Added Config Files', ad.spec_file));
消息是:
message is: No such file or directory
目标: 重新排列文件位置是一种足够的解决方法,而可执行文件仅在我的计算机上运行,但是我们的想法是独立运行并将其分发给许多不同计算机上的多人。我希望能够有一个带有启动文件的顶级文件夹,并且在这个文件夹中,有包需要的尽可能多的子文件夹。启动文件应该能够根据需要访问其中的所有子文件夹和文件。我在这里读到了一些关于从机器上的“秘密位置”实际运行的可执行文件:http: //matlab.wikia.com/wiki/FAQ
我只是希望能够将一个完整的文件夹树及其所有文件分组到一个包含可执行文件的包中,并能够在任何地方运行它。
更多信息: 当我将 spec.csv 文件放在与 STARUTP1.m 相同的目录中时,它发现使用没有 -a 'path' 选项的 mcc 并在 LoadXLS.m 文件中使用以下内容很好:
[tempFile, message] = fopen(ad.spec_file,'r');
该项目包含 GUI、生成 PDF、生成图,还创建了一个 zip 目录。
先感谢您。