64 ビット Windows プラットフォームでの MSVC ツールチェーンを使用した 32 ビット DLL のビルド
メモ: Microsoft® Visual Studio® がインストールされている Windows® で単に 32 ビット DLL を生成するには、Microsoft Visual Studio Project 2017 | CMake (32-bit Windows)
などの CMake ツールチェーンを使用します。このページでは、カスタム ツールチェーンを作成してコンパイラ オプションを変更し、新しいコンパイラを統合する方法について説明しています。CMake を使用した生成コードのビルドの詳細については、Configure CMake Build Processを参照してください。
64 ビット Windows プラットフォームで実行される Microsoft Visual C/C++ (MSVC) ツールチェーンを登録および使用して 32 ビット ダイナミック リンク ライブラリ (DLL) をコンパイルします。この例では Microsoft のコンパイラを使用します。ただし、概念とプログラミング インターフェイスはその他のツールチェーンに適用されます。ツールチェーンを登録すると、ツールチェーンのリストから選択できるようになり、コード ジェネレーターはそのツールチェーンを使用してコードをビルドするための makefile を生成します。ツールチェーンはコンパイラ、リンカー、アーカイバーなどのいくつかのツールから構成され、それらのツールには複数の異なる構成オプションがあります。ツールチェーンは指定されたプラットフォーム上でコードをコンパイルし、リンクして実行します。この例で使用するファイルにアクセスするには、[Open Script] をクリックします。
プラットフォームの確認と MSVC バージョンの判別
このコードは、プラットフォームがサポートされていて、サポート対象バージョンの Microsoft Visual C/C++ を保有していることを確認します。my_msvc_32bit_tc.m
ツールチェーン定義は Microsoft Visual Studio Version 9.0、10.0、11.0、12.0、14.0 または 15.0 を使用できます。
Windows® プラットフォームを使用していない場合、またはサポートされているバージョンの Microsoft Visual C/C++ がない場合、この例ではコードと makefile のみが生成され、生成された makefile は実行されません。
VersionNumbers = {'14.0'}; % Placeholder value if ~ispc supportedCompilerInstalled = false; else installed_compilers = mex.getCompilerConfigurations('C', 'Installed'); MSVC_InstalledVersions = regexp({installed_compilers.Name}, 'Microsoft Visual C\+\+ 20\d\d'); MSVC_InstalledVersions = cellfun(@(a)~isempty(a), MSVC_InstalledVersions); if ~any(MSVC_InstalledVersions) supportedCompilerInstalled = false; else VersionNumbers = {installed_compilers(MSVC_InstalledVersions).Version}'; supportedCompilerInstalled = true; end end
ダイナミック リンク ライブラリの関数
ダイナミック リンク ライブラリのサンプル関数 myMatlabFunction.m
は、数値を 2 倍にする関数です。
function y = myMatlabFunction(u) % myMatlabFunction: Returns twice its input. % Copyright 2017 The MathWorks, Inc. %#codegen assert(isa(u, 'double'), 'The input must be a "double".'); assert(all([1, 1] == size( u )), 'The input must be a scalar.'); y = double(u + u);
MSVC ツールチェーンの作成と構成
my_msvc_32bit_tc.m
ツールチェーン定義の関数は、Visual Studio のバージョン番号を含む引数を取ります。この例では、このツールチェーンを作成して構成するコマンドを示します。
tc = my_msvc_32bit_tc(VersionNumbers{end}); save my_msvc_32bit_tc tc;
Executing "C:\Users\user\OneDrive - MathWorks\Documents\MATLAB\ExampleManager\user.Bdoc\coder-ex19875030\my_msvc_32bit_tc"... Executed "C:\Users\user\OneDrive - MathWorks\Documents\MATLAB\ExampleManager\user.Bdoc\coder-ex19875030\my_msvc_32bit_tc".
ツールチェーンの登録
コード ジェネレーターのビルド プロセスでツールチェーンを使用するには、そのツールチェーンを RTW.TargetRegistry
に登録しておかなければなりません。登録には MATLAB® パス上にある rtwTargetInfo.m
ファイルを使用します。このファイルが RTW.TargetRegistry
のリセット時に MATLAB で読み込まれます。
対応するテキスト ファイル myRtwTargetInfo.txt
から rtwTargetInfo.m
ファイルを作成します。
function myRtwTargetInfo(tr) %RTWTARGETINFO Registration file for custom toolchains. % Copyright 2012-2017 The MathWorks, Inc. tr.registerTargetInfo(@createToolchainRegistryFor32BitMSVCToolchain); end % ------------------------------------------------------------------------- % Create the ToolchainInfoRegistry entries % ------------------------------------------------------------------------- function config = createToolchainRegistryFor32BitMSVCToolchain config(1) = coder.make.ToolchainInfoRegistry; config(1).Name = 'Microsoft 32 Bit Toolchain | nmake makefile (64-bit Windows)'; config(1).FileName = fullfile(fileparts(mfilename('fullpath')), 'my_msvc_32bit_tc.mat'); config(1).TargetHWDeviceType = {'Intel->x86-32 (Windows32)','AMD->x86-32 (Windows32)','Generic->Unspecified (assume 32-bit Generic)'}; config(1).Platform = {'win64'}; end
copyfile myRtwTargetInfo.txt rtwTargetInfo.m RTW.TargetRegistry.getInstance('reset');
コード生成構成オブジェクトの作成
32 ビット ダイナミック リンク ライブラリ (DLL) を生成するには、'dll'
コード生成構成オブジェクトを作成します。'dll'
を指定すると、リンカー (ツールチェーンのビルド ツール) で "共有ライブラリ" のリンカー コマンドが使用されるようになります。
cfg = coder.config('dll');
32 ビット ハードウェア用のコード生成の構成
32 ビット ハードウェアと互換性のあるコードを正常に生成するには、生成コードで使用する基となる C の型 (int
や signed char
など) が正しくなければなりません。これらの型は、固定サイズの型 (uint8
や int16
など) の typedef
ステートメントの基となります。次のコマンドを使用して構成を設定します。
cfg.HardwareImplementation.ProdHWDeviceType = ... 'Generic->Unspecified (assume 32-bit Generic)';
32 ビット ツールチェーンを使用するようコード生成を構成
rtwTargetInfo.m
ファイルで指定した Name
と一致するように Toolchain
プロパティの名前を設定します。
cfg.Toolchain = ... 'Microsoft 32 Bit Toolchain | nmake makefile (64-bit Windows)';
詳細ステータス レポートの選択
ツールチェーンで DLL のビルドに使用されるコンパイラ フラグを確認するには、詳細ステータス レポートを選択します。
cfg.Verbose = true;
コード生成のみを行うかどうかの判別
Microsoft コンパイラがインストールされていない場合、コード ジェネレーターはコードと makefile のみを生成します。サポートされているコンパイラがインストールされている場合、コード ジェネレーターは 32 ビット バイナリ ファイルをビルドします。
if supportedCompilerInstalled cfg.GenCodeOnly = false; else cfg.GenCodeOnly = true; end
コードの生成と DLL のビルド
ツールチェーンを使用してコードを生成し、DLL をビルドする (ビルドが有効な場合) には、コマンド プロンプトで、次のように入力します。
codegen -config cfg myMatlabFunction -args { double(1.0) };
### Compiling function(s) myMatlabFunction ... ------------------------------------------------------------------------ Compilation suppressed: generating code only. ------------------------------------------------------------------------ Code generation successful.
実行可能ファイルのビルドと実行
インストールされているコンパイラのバージョンがサポートされている場合、C の main 関数を使用して 32 ビットの実行可能ファイルをビルドできます。実行可能ファイルを使用して、生成されたコードが予想どおりに機能することをテストできます。
cfge = coder.config('exe'); cfge.CustomInclude = {pwd}; cfge.CustomSource = 'myMatlabFunction_main.c'; cfge.GenCodeOnly = cfg.GenCodeOnly; cfge.Verbose = true; cfge.Toolchain = ... 'Microsoft 32 Bit Toolchain | nmake makefile (64-bit Windows)'; codegen -config cfge myMatlabFunction -args { double(1.0) }; if supportedCompilerInstalled pause(5); %wait for EXE to get generated system('myMatlabFunction 3.1416'); % Expected output: myMatlabFunction(3.1416) = 6.2832 end
### Compiling function(s) myMatlabFunction ... ------------------------------------------------------------------------ Compilation suppressed: generating code only. ------------------------------------------------------------------------ Code generation successful.
オプション手順: ツールチェーンの登録解除
ツールチェーンの登録を解除するには、次のように入力します。
delete ./rtwTargetInfo.m RTW.TargetRegistry.getInstance('reset');