2012-07-05 62 views
1

我试图编译一些C++文件具有相同的名称(的fileA),但位于不同的文件夹(文件夹1和文件夹2),让说:Matlab的MEX 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一个解决方案,但似乎它是不支持这样的东西...

回答

1

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

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

我想不出有什么其他办法来达到你想要的效果(只需调用一次mex函数)。

1

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

mex folder1/filleA.cpp -output folder1/fileA 
+0

我实际上编译所有的文件,一次调用mex为了最终生成mex。据我了解,您的解决方案会为一个单一文件生成输出,但不是所有文件都在一起。正确? – OnaBai 2012-07-05 17:59:02

+0

是正确的,但是每个mex命令只有一个输出,不是吗? – Oli 2012-07-05 23:44:23

+0

是的,但一个'mex'文件可能包含多个'obj'文件。如果'mex'脚本将所有'obj'文件保存在同一个文件夹中(后者将它们连接到一个单独的'mexw32'中),则其中一个被另一个覆盖,因此第一个文件的内容会丢失。 – OnaBai 2012-07-06 00:48:46

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 
+0

这样做,我得到的是多个'mexw32'文件,而不是将它们全部链接到一个文件中。 到目前为止,我正在用'-c'做类似的事情,只是生成对象,然后调用最后的mex来将它们链接到'mexw32'中。但这是非常手动的,对我来说似乎很奇怪,mex实际上将文件夹结构扁平化(所有中间对象放在一个文件夹中,而不是保留原始结构以避免名称冲突)。 – OnaBai 2012-07-05 20:41:39

0

实际上,您可以在不运行matlab的情况下编译和构建mex文件。它背后的过程是一个正常的编译(创建目标文件并将它们链接起来)。 对于正常的编译,具有相同名称的对象文件(在不同的目录中)是没有问题的。 我会同意robince做makefile可以帮助你实现你想要的,但是如果makefiles不是你喝杯茶的话,只需要一个简单的shell/batch脚本就可以完成一系列的编译命令(见下文)。

您可能会给几个文件作为mex的参数。 要了解什么MATLAB是真的做,你可以用标志-v

mex -v folder1/file1.cpp folder1/file2.cpp 

看看出现在Matlab的命令窗口“的编译命令运行 - > GCC等。“你可以在命令提示符下运行它们,对于每一个文件,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。 我希望它有帮助!

相关问题