1

同じ名前(fileA)で、異なるフォルダー(folder1とfolder2)にあるC++ファイルをコンパイルしようとしています。

folder1/fileA.cpp
folder1/fileB.cpp

folder2/fileA.cpp
folder2/fileC.cpp

これらのファイルには、さまざまなクラスが含まれています。

ただしmex、folder1/fileA.cppとfolder2/fileA.cppの両方のオブジェクトを同じフォルダーに作成するため、最終的なW32ファイルを生成しようとすると、一部のクラスが欠落します。

フォルダー構造を「フラット化」せずに、一方のfileA.objをもう一方のfileA.objで上書きしないように、mexに指示する方法はありますか?


提案されたすべてのソリューションは、最終的に同じ基本的な考え方になります。つまり、独自のコンパイルプロセス(つまり、 Makefileなど)を準備します。このソリューションに関する私の問題は、Linux、Windows、32ビットまたは64ビットなどで同じではなく、保守が容易ではないことです。だから私はに基づいた解決策を持っていることを好んだでしょうがmex、それはサポートされていないもののようです...

4

4 に答える 4

1

出力ディレクトリは手動で指定できます。

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

この種の柔軟性が必要な場合は、各オブジェクトファイルを個別にコンパイルするという従来のUNIXMakefileベースの戦略に従う必要があります。

たとえば、ソースファイルごとに、Oliの回答で指定されているディレクトリオプションを使用mex -c-outputてオブジェクトファイルを作成できます。その後に、これらのオブジェクトファイルを使用する出力関数の最後のmexが1つ続きます。

私はあなたが望むものを達成するための他の方法を考えることができません(mex関数の1回の呼び出しで)。

于 2012-07-06T13:20:50.960 に答える
0

matlabを実行しなくても、実際にmexファイルをコンパイルおよびビルドできます。その背後にあるプロセスは、通常のコンパイル(オブジェクトファイルの作成とそれらのリンク)です。また、通常のコンパイルでは、同じ名前のオブジェクトファイルが(異なるディレクトリに)あることは問題ありません。私は、makefileを実行することで目的を達成できるというロビンスに同意しますが、makefileがあなたのお茶ではない場合は、単純なシェル/バッチスクリプトだけで一連のコンパイルコマンドを実行できます(以下を参照)。

あなたはおそらく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がコンパイルされます。たぶん、mexoptionsファイルに入れることができるすべてを回避するためのgccオプションがあります。私はそれを知ってうれしいです!それ以外の場合は、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 に答える