0

MCR (MatLab Compiler Runtime) を使用して C++ で MatLab 関数を使用しようとしています。ただし、C++ から関数を呼び出すとエラーが発生します。

これは、ビルドしようとしたときの出力です。

  1>------ Build started: Project: MatLab DLL Test 2, Configuration: Debug x64 ------

  1>Compiling...

  1>main.cpp

  1>libfoo.cpp

  1>Generating Code...

  1>Linking...

  1>libfoo.lib(libfoo.dll) : error LNK2005: "void __cdecl foo(int,class mwArray &,class mwArray const &)" (?foo@@YAXHAEAVmwArray@@AEBV1@@Z) already defined in libfoo.obj

  1>libfoo.lib(libfoo.dll) : error LNK2005: "void __cdecl foo(int,class mwArray &,class mwArray const &)" (?foo@@YAXHAEAVmwArray@@AEBV1@@Z) already defined in libfoo.obj

  1>C:\Users\fmarsman\Documents\Visual Studio 2008\Projects\Project1\MatLab DLL Test 2\x64\Debug\MatLab DLL Test 2.exe : fatal error LNK1169: one or more multiply defined symbols found

  1>Build log was saved at "file://c:\Users\fmarsman\Documents\Visual Studio 2008\Projects\Project1\MatLab DLL Test 2\MatLab DLL Test 2\x64\Debug\BuildLog.htm"

  1>MatLab DLL Test 2 - 3 error(s), 0 warning(s)

  ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

これは私がやったことです:

  • .m ファイルfoo.mを作成しました。

    関数 y = foo(x)

    y = x + 1;

  • コマンドプロンプトで、次を実行しました:

    mcc –W cpplib:libfoo –T リンク:lib foo

  • これにより、 libfoo.liblibfoo.hlibfoo.dll 、およびlibfoo.cppが作成されました

  • 次に、MS Visual Studio 2008 でプロジェクトを作成します。「ソース ファイル」に libfoo.cpp を、「ヘッダー ファイル」に libfoo.h を追加しました。構成プロパティ -> C/C++ -> 一般 -> 追加のインクルード ディレクトリに 3 つのディレクトリを追加しました。

C:\Users\fmarsman\Documents\MATLAB\DLL Test 2 (すべての libfoo.* ファイルがあるフォルダー)

C:\Program Files\MATLAB\MATLAB Compiler Runtime\v82\extern\lib\win64\microsoft (mclmcrrt.lib 用)

C:\MATLAB\R2013b\extern\include (mclmcrrt.h 用)

  • リンカーに -> 入力 -> 追加した追加の依存関係:

"C:\Program Files\MATLAB\MATLAB Compiler Runtime\v82\extern\lib\win64\microsoft\mclmcrrt.lib" "C:\Users\fmarsman\Documents\MATLAB\DLL Test 2\libfoo.lib"

私のソースコード:

  #include <iostream>
  #include <mclmcrrt.h>
  #include <mclcppclass.h>
  #include <libfoo.h>
  using namespace std;

  int main( ) {
    mclInitializeApplication(NULL,0);
    libfooInitialize( );

    mwArray y(1, 1, mxDOUBLE_CLASS);
    y = 3.0;
    const mwArray x = y.Clone();

    foo(1,y,x);

    mclTerminateApplication( );
    libfooTerminate( );

    return 0;
} // main

私は一日中解決策を見つけようとしましたが、成功しませんでした。誰かがこれで私を助けてくれることを本当に願っています。

4

1 に答える 1