【问题标题】:Matlab MEX C++ two files with same name in different foldersMatlab MEX C++ 不同文件夹中的两个同名文件
【发布时间】:2012-07-07 20:35:00
【问题描述】:

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

【问题讨论】:

    标签: c matlab mex


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      可以手动指定输出目录:

      mex folder1/filleA.cpp -output folder1/fileA
      

      【讨论】:

      • 我实际上是通过一次调用 mex 来编译所有文件,以便最终生成 mex。据我了解,您的解决方案会为单个文件生成输出,但并非所有文件都生成在一起。对吗?
      • 正确,但无论如何每个 mex 命令只有一个输出,不是吗?
      • 是的,但一个mex 文件可能包含多个obj 文件。如果mex 脚本将所有obj 文件保存在同一个文件夹中(以便后者将它们链接到一个mexw32),则一个会被另一个覆盖,因此第一个的内容会丢失。
      【解决方案3】:

      怎么样

      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
      

      【讨论】:

      • 这样做我得到的是多个mexw32 文件,而不是所有这些文件都链接在一个文件中。到目前为止,我正在做与-c 类似的事情,仅用于生成对象,然后调用最终的mex 以将它们链接到mexw32。但这非常手动,对我来说似乎很奇怪 mex 实际上扁平化文件夹结构(一个文件夹中的所有中间对象,而不是保留原始结构以避免名称冲突)。
      【解决方案4】:

      您实际上可以在不运行 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。 希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 2013-06-11
        • 1970-01-01
        • 2013-12-10
        • 1970-01-01
        • 2013-06-21
        • 2012-11-12
        • 2015-01-04
        • 2020-01-13
        • 2018-12-28
        相关资源
        最近更新 更多