2012-07-05 35 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。 我希望它有幫助!

相關問題