Matlab MEX C ++在不同文件夹中具有相同名称的两个文件

时间:2012-07-05 15:24:50

标签: c matlab mex

我正在尝试编译一些具有相同名称(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的解决方案,但似乎不支持这样的解决方案......

4 个答案:

答案 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。 我希望它有所帮助!