Main Content

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\mamlicke\OneDrive - MathWorks\Documents\MATLAB\ExampleManager\mamlicke.Bdoc24a.j2373701\coder-ex19875030\my_msvc_32bit_tc"...
Executed "C:\Users\mamlicke\OneDrive - MathWorks\Documents\MATLAB\ExampleManager\mamlicke.Bdoc24a.j2373701\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 の型 (intsigned char など) が正しくなければなりません。これらの型は、固定サイズの型 (uint8int16 など) の 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 ...
------------------------------------------------------------------------
### Using toolchain: Microsoft 32 Bit Toolchain | nmake makefile (64-bit Windows)
### 'C:\Users\mamlicke\OneDrive - MathWorks\Documents\MATLAB\ExampleManager\mamlicke.Bdoc24a.j2373701\coder-ex19875030\codegen\dll\myMatlabFunction\myMatlabFunction_rtw.mk' is up to date
### Building 'myMatlabFunction': nmake  -f myMatlabFunction_rtw.mk all
**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.11.7
** Copyright (c) 2021 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64_x86'

Microsoft (R) Program Maintenance Utility Version 14.29.30137.0
Copyright (C) Microsoft Corporation.  All rights reserved.

	cl  -c -nologo -GS -W4 -DWIN32 -D_MT -MTd -D_CRT_SECURE_NO_WARNINGS  /O2 /Oy-  -DMODEL=myMatlabFunction @myMatlabFunction_rtw_comp.rsp -Fo"myMatlabFunction_initialize.obj" "C:\Users\mamlicke\ONEDRI~1\DOCUME~1\MATLAB\EXAMPL~1\MAMLIC~2.J23\CODER-~1\codegen\dll\myMatlabFunction\myMatlabFunction_initialize.c"
myMatlabFunction_initialize.c
	cl  -c -nologo -GS -W4 -DWIN32 -D_MT -MTd -D_CRT_SECURE_NO_WARNINGS  /O2 /Oy-  -DMODEL=myMatlabFunction @myMatlabFunction_rtw_comp.rsp -Fo"myMatlabFunction_terminate.obj" "C:\Users\mamlicke\ONEDRI~1\DOCUME~1\MATLAB\EXAMPL~1\MAMLIC~2.J23\CODER-~1\codegen\dll\myMatlabFunction\myMatlabFunction_terminate.c"
myMatlabFunction_terminate.c
	cl  -c -nologo -GS -W4 -DWIN32 -D_MT -MTd -D_CRT_SECURE_NO_WARNINGS  /O2 /Oy-  -DMODEL=myMatlabFunction @myMatlabFunction_rtw_comp.rsp -Fo"myMatlabFunction.obj" "C:\Users\mamlicke\ONEDRI~1\DOCUME~1\MATLAB\EXAMPL~1\MAMLIC~2.J23\CODER-~1\codegen\dll\myMatlabFunction\myMatlabFunction.c"
myMatlabFunction.c
### Creating dynamic library ".\myMatlabFunction.dll" ...
	link /MACHINE:X86 /DEBUG /DEBUGTYPE:cv  /INCREMENTAL:NO /NOLOGO kernel32.lib ws2_32.lib mswsock.lib advapi32.lib  -dll -def:myMatlabFunction.def -out:.\myMatlabFunction.dll @myMatlabFunction_rtw.rsp  
   Creating library .\myMatlabFunction.lib and object .\myMatlabFunction.exp
### Created: .\myMatlabFunction.dll
### Successfully generated all binary outputs.


------------------------------------------------------------------------
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 ...
------------------------------------------------------------------------
### Using toolchain: Microsoft 32 Bit Toolchain | nmake makefile (64-bit Windows)
### 'C:\Users\mamlicke\OneDrive - MathWorks\Documents\MATLAB\ExampleManager\mamlicke.Bdoc24a.j2373701\coder-ex19875030\codegen\exe\myMatlabFunction\myMatlabFunction_rtw.mk' is up to date
### Building 'myMatlabFunction': nmake  -f myMatlabFunction_rtw.mk all
**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.11.7
** Copyright (c) 2021 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64_x86'

Microsoft (R) Program Maintenance Utility Version 14.29.30137.0
Copyright (C) Microsoft Corporation.  All rights reserved.

	cl  -c -nologo -GS -W4 -DWIN32 -D_MT -MTd -D_CRT_SECURE_NO_WARNINGS  /O2 /Oy-  -DMODEL=myMatlabFunction @myMatlabFunction_rtw_comp.rsp -Fo"myMatlabFunction_main.obj" "C:\Users\mamlicke\ONEDRI~1\DOCUME~1\MATLAB\EXAMPL~1\MAMLIC~2.J23\CODER-~1\myMatlabFunction_main.c"
myMatlabFunction_main.c
	cl  -c -nologo -GS -W4 -DWIN32 -D_MT -MTd -D_CRT_SECURE_NO_WARNINGS  /O2 /Oy-  -DMODEL=myMatlabFunction @myMatlabFunction_rtw_comp.rsp -Fo"myMatlabFunction_initialize.obj" "C:\Users\mamlicke\ONEDRI~1\DOCUME~1\MATLAB\EXAMPL~1\MAMLIC~2.J23\CODER-~1\codegen\exe\myMatlabFunction\myMatlabFunction_initialize.c"
myMatlabFunction_initialize.c
	cl  -c -nologo -GS -W4 -DWIN32 -D_MT -MTd -D_CRT_SECURE_NO_WARNINGS  /O2 /Oy-  -DMODEL=myMatlabFunction @myMatlabFunction_rtw_comp.rsp -Fo"myMatlabFunction_terminate.obj" "C:\Users\mamlicke\ONEDRI~1\DOCUME~1\MATLAB\EXAMPL~1\MAMLIC~2.J23\CODER-~1\codegen\exe\myMatlabFunction\myMatlabFunction_terminate.c"
myMatlabFunction_terminate.c
	cl  -c -nologo -GS -W4 -DWIN32 -D_MT -MTd -D_CRT_SECURE_NO_WARNINGS  /O2 /Oy-  -DMODEL=myMatlabFunction @myMatlabFunction_rtw_comp.rsp -Fo"myMatlabFunction.obj" "C:\Users\mamlicke\ONEDRI~1\DOCUME~1\MATLAB\EXAMPL~1\MAMLIC~2.J23\CODER-~1\codegen\exe\myMatlabFunction\myMatlabFunction.c"
myMatlabFunction.c
### Creating standalone executable "C:\Users\mamlicke\ONEDRI~1\DOCUME~1\MATLAB\EXAMPL~1\MAMLIC~2.J23\CODER-~1\myMatlabFunction.exe" ...
	link /MACHINE:X86 /DEBUG /DEBUGTYPE:cv  /INCREMENTAL:NO /NOLOGO kernel32.lib ws2_32.lib mswsock.lib advapi32.lib -out:C:\Users\mamlicke\ONEDRI~1\DOCUME~1\MATLAB\EXAMPL~1\MAMLIC~2.J23\CODER-~1\myMatlabFunction.exe @myMatlabFunction_rtw.rsp  
### Created: C:\Users\mamlicke\ONEDRI~1\DOCUME~1\MATLAB\EXAMPL~1\MAMLIC~2.J23\CODER-~1\myMatlabFunction.exe
### Successfully generated all binary outputs.


------------------------------------------------------------------------
Code generation successful.

myMatlabFunction(3.1416) = 6.2832 

オプション手順: ツールチェーンの登録解除

ツールチェーンの登録を解除するには、次のように入力します。

delete ./rtwTargetInfo.m
RTW.TargetRegistry.getInstance('reset');

関連するトピック