我正在尝试编译一些具有相同名称(fileA)但位于不同文件夹(folder1和folder2)的C ++文件,让我们说:
folder1/fileA.cpp
folder1/fileB.cpp
和
folder2/fileA.cpp
folder2/fileC.cpp
这些文件包含不同的类。
但是mex
在同一文件夹中为folder1 / fileA.cpp和folder2 / fileA.cpp创建了对象,所以当它尝试生成最终的W32文件时,缺少一些类。
有没有办法告诉mex不要“压平”文件夹结构,然后不要用另一个fileA.obj覆盖一个fileA.obj?
所有提议的解决方案最终都有相同的基本思想:准备我自己的编译过程(即 Makefile 或类似的)。使用此解决方案的我的问题是它们对于Linux,Windows,32或64位不同,......并且不易维护。这就是为什么我宁愿选择基于mex
的解决方案,但似乎不支持这样的解决方案......
答案 0 :(得分:1)
您可以手动指定输出目录:
mex folder1/filleA.cpp -output folder1/fileA
答案 1 :(得分:1)
如果您需要这种灵活性,则需要遵循传统的基于UNIX Makefile的策略,即单独编译每个目标文件。
例如,对于每个源文件,您可以使用mex -c
和Oli的答案中指定的-output
目录选项来创建目标文件 - 然后使用输出函数的单个最终mex这些目标文件。
我想不出任何其他方式来实现你想要的东西(只需要调用mex函数)。
答案 2 :(得分:0)
怎么样
mymex(list_of_files);
mymex.m是:
function mymex(list_of_files)
for n = 1:length(list_of_files),
mex list_of_files(n) -output % do some string manipulation on list_of_files(n) here to get the right output file location
end
end
答案 3 :(得分:0)
您可以在不运行matlab的情况下实际编译和构建mex文件。它背后的过程是正常的编译(创建目标文件并链接它们)。 对于正常的编译,使具有相同名称的对象文件(在不同的目录中)没有问题。 我同意robince做一个makefile可以帮助你实现你想要的东西,但是如果makefile不是你的一杯茶,只需一个简单的shell / batch脚本就可以完成一系列编译命令(见下文)。
你可能会给mex提供几个文件作为参数。 要了解matlab的实际用途,可以使用标志-v
运行它 mex -v folder1/file1.cpp folder1/file2.cpp
查看Matlab命令窗口中显示的编译命令“ - > gcc etc.”。您可以在命令提示符下运行它们。对于每个文件,Matlab只需用(相当)一些标志调用编译器并包含路径。如您所知,这会生成对象文件,最后,所有内容都链接在一起。此阶段失败,因为matlab在未指定输出的情况下调用编译器,因此默认情况下编译器将对象文件放在当前目录中。
为了避免你必须像这样指定一个输出文件(参见-o标志):
gcc -c MATLABFLAGS folder1/File.cpp -o folder1/File.o
如果你有很多文件,那就是Makefile变得方便:
%Folder/.o: %.c
$(CC) -I$(MATINC) $(CCFLAGS) -c $<
最后,对于链接阶段,您必须输入对象文件的真实位置:
gcc MATLAB_LINK_FLAGS -o Final_MexFile.mex* Folder1/File.o Folder2/File.o etc...
编译mex。 也许有一个gcc选项可以避免你可以放在mexoptions文件中的所有内容。我很高兴知道它!否则,我建议使用Makefile。 我希望它有所帮助!