1

我正在尝试编译一些具有相同名称(fileA)但位于不同文件夹(文件夹 1 和文件夹 2)中的 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?


所有提出的解决方案最终都具有相同的基本思想:准备我自己的编译过程(即Makefiles或类似的)。对这个解决方案的问题是它们对于 Linux、Windows、32 或 64 位不一样,......并且不容易维护。这就是为什么我更希望有一个基于mex但似乎不受支持的解决方案,所以......

4

4 回答 4

1

您可以手动指定输出目录:

mex folder1/filleA.cpp -output folder1/fileA
于 2012-07-05T16:37:36.017 回答
1

如果您需要这种灵活性,您将需要遵循传统的基于 UNIX Makefile 的策略,即分别编译每个目标文件。

例如,对于每个源文件,您可以使用在 Oli 的答案中指定mex -c-output目录选项来创建目标文件 - 然后是使用这些目标文件的输出函数的单个最终 mex。

我想不出任何其他方法来实现你想要的(只需调用一次 mex 函数)。

于 2012-07-06T13:20:50.960 回答
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。我希望它有帮助!

于 2012-07-06T16:15:25.603 回答
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
于 2012-07-05T19:23:03.583 回答