Зарегистрируйте и используйте цепочку инструментов Microsoft ® Visual C/C + + (MSVC), работающую на 64-разрядной платформе Windows ®, для компиляции 32-разрядной библиотеки динамических ссылок (DLL). В этом примере используется компилятор Microsoft ®. Однако концепции и интерфейс программирования применимы и к другим инструментальным цепям. После регистрации цепочки инструментов ее можно выбрать из списка, и генератор кода создаст файл make-файла для создания кода с помощью этой цепочки инструментов. Инструментальная цепочка состоит из нескольких инструментов, таких как компилятор, компоновщик и архиватор с несколькими различными опциями конфигурации. Инструментальная цепочка компилирует, связывает и запускает код на указанной платформе. Чтобы получить доступ к файлам, используемым в этом примере, щелкните Открыть сценарий.
Этот код проверяет, поддерживается ли платформа и поддерживается ли версия Microsoft ® Visual C/C + +. my_msvc_32bit_tc.m определение цепочки инструментов может использовать Microsoft ® Visual Studio версий 9.0, 10.0, 11.0, 12.0, 14.0 или 15.0.
Если вы не используете платформу Windows ® или у вас нет поддерживаемой версии Microsoft ® Visual C/C + +, в примере создается только код и make-файл без запуска созданного make-файла.
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, умножает число на два.
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);
my_msvc_32bit_tc.m функция определения цепочки инструментов принимает аргумент, содержащий номер версии Visual Studio. В этом примере для создания и настройки этой цепочки инструментов используются следующие команды:
tc = my_msvc_32bit_tc(VersionNumbers{end});
save my_msvc_32bit_tc tc;
Executing "H:\Examples\coder-ex19875030\my_msvc_32bit_tc"... Executed "H:\Examples\coder-ex19875030\my_msvc_32bit_tc".
Прежде чем генератор кода сможет использовать цепочку инструментов для процесса построения, RTW.TargetRegistry должен содержать регистрацию цепочки инструментов. Эта регистрация может быть получена от любого rtwTargetInfo.m по пути MATLAB. MATLAB загрузит новую регистрацию, если RTW.TargetRegistry сбрасывается.
Создать rtwTargetInfo.m файл из соответствующего текстового файла myRtwTargetInfo.txt.
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-разрядным оборудованием, созданный код должен использовать правильные базовые типы C (например, int, signed char, и другие). Эти типы являются основой для typedef операторы для типов размеров (например, uint8, int16, и другие). Настройте конфигурацию с помощью команды:
cfg.HardwareImplementation.ProdHWDeviceType = ... 'Generic->Unspecified (assume 32-bit Generic)';
Задайте имя Toolchain для соответствия свойству Name , которые вы указываете в rtwTargetInfo.m файл.
cfg.Toolchain = ... 'Microsoft 32 Bit Toolchain | nmake makefile (64-bit Windows)';
Чтобы предоставить подтверждение флагов компилятора, которые используются в цепочке инструментов для построения DLL, выберите подробный отчет о состоянии.
cfg.Verbose = true;
Если компиляторы Microsoft ® не установлены, генератор кода генерирует только код и файл make. При установке поддерживаемых компиляторов генератор кода создает 32-разрядный двоичный файл.
if supportedCompilerInstalled cfg.GenCodeOnly = false; else cfg.GenCodeOnly = true; end
Чтобы использовать цепочку инструментов для создания кода и построения DLL (если сборка включена), в командной строке введите:
codegen -config cfg myMatlabFunction -args { double(1.0) };
### Using toolchain: Microsoft 32 Bit Toolchain | nmake makefile (64-bit Windows) ### Creating 'H:\Examples\coder-ex19875030\codegen\dll\myMatlabFunction\myMatlabFunction_rtw.mk' ... ### Building 'myMatlabFunction': nmake -f myMatlabFunction_rtw.mk all H:\Examples\coder-ex19875030\codegen\dll\myMatlabFunction>set "VSCMD_START_DIR=H:\Examples\coder-ex19875030\codegen\dll\myMatlabFunction" H:\Examples\coder-ex19875030\codegen\dll\myMatlabFunction>call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\\VC\Auxiliary\Build\vcvarsall.bat" amd64_x86 ********************************************************************** ** Visual Studio 2017 Developer Command Prompt v15.0.26730.12 ** Copyright (c) 2017 Microsoft Corporation ********************************************************************** [vcvarsall.bat] Environment initialized for: 'x64_x86' Microsoft (R) Program Maintenance Utility Version 14.11.25507.1 Copyright (C) Microsoft Corporation. All rights reserved. cl -c -nologo -GS -W4 -DWIN32 -D_MT -MTd -D_CRT_SECURE_NO_WARNINGS /Od /Oy- -DMODEL=myMatlabFunction -DHAVESTDIO -DUSE_RTMODEL @myMatlabFunction_rtw_comp.rsp -Fo"myMatlabFunction_initialize.obj" "H:\Examples\coder-ex19875030\codegen\dll\myMatlabFunction\myMatlabFunction_initialize.c" myMatlabFunction_initialize.c cl -c -nologo -GS -W4 -DWIN32 -D_MT -MTd -D_CRT_SECURE_NO_WARNINGS /Od /Oy- -DMODEL=myMatlabFunction -DHAVESTDIO -DUSE_RTMODEL @myMatlabFunction_rtw_comp.rsp -Fo"myMatlabFunction_terminate.obj" "H:\Examples\coder-ex19875030\codegen\dll\myMatlabFunction\myMatlabFunction_terminate.c" myMatlabFunction_terminate.c cl -c -nologo -GS -W4 -DWIN32 -D_MT -MTd -D_CRT_SECURE_NO_WARNINGS /Od /Oy- -DMODEL=myMatlabFunction -DHAVESTDIO -DUSE_RTMODEL @myMatlabFunction_rtw_comp.rsp -Fo"myMatlabFunction.obj" "H:\Examples\coder-ex19875030\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.
Если установлена поддерживаемая версия компилятора, можно построить 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
### Using toolchain: Microsoft 32 Bit Toolchain | nmake makefile (64-bit Windows) ### Creating 'H:\Examples\coder-ex19875030\codegen\exe\myMatlabFunction\myMatlabFunction_rtw.mk' ... ### Building 'myMatlabFunction': nmake -f myMatlabFunction_rtw.mk all H:\Examples\coder-ex19875030\codegen\exe\myMatlabFunction>set "VSCMD_START_DIR=H:\Examples\coder-ex19875030\codegen\exe\myMatlabFunction" H:\Examples\coder-ex19875030\codegen\exe\myMatlabFunction>call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\\VC\Auxiliary\Build\vcvarsall.bat" amd64_x86 ********************************************************************** ** Visual Studio 2017 Developer Command Prompt v15.0.26730.12 ** Copyright (c) 2017 Microsoft Corporation ********************************************************************** [vcvarsall.bat] Environment initialized for: 'x64_x86' Microsoft (R) Program Maintenance Utility Version 14.11.25507.1 Copyright (C) Microsoft Corporation. All rights reserved. cl -c -nologo -GS -W4 -DWIN32 -D_MT -MTd -D_CRT_SECURE_NO_WARNINGS /Od /Oy- -DMODEL=myMatlabFunction -DHAVESTDIO -DUSE_RTMODEL @myMatlabFunction_rtw_comp.rsp -Fo"myMatlabFunction_initialize.obj" "H:\Examples\coder-ex19875030\codegen\exe\myMatlabFunction\myMatlabFunction_initialize.c" myMatlabFunction_initialize.c cl -c -nologo -GS -W4 -DWIN32 -D_MT -MTd -D_CRT_SECURE_NO_WARNINGS /Od /Oy- -DMODEL=myMatlabFunction -DHAVESTDIO -DUSE_RTMODEL @myMatlabFunction_rtw_comp.rsp -Fo"myMatlabFunction_terminate.obj" "H:\Examples\coder-ex19875030\codegen\exe\myMatlabFunction\myMatlabFunction_terminate.c" myMatlabFunction_terminate.c cl -c -nologo -GS -W4 -DWIN32 -D_MT -MTd -D_CRT_SECURE_NO_WARNINGS /Od /Oy- -DMODEL=myMatlabFunction -DHAVESTDIO -DUSE_RTMODEL @myMatlabFunction_rtw_comp.rsp -Fo"myMatlabFunction.obj" "H:\Examples\coder-ex19875030\codegen\exe\myMatlabFunction\myMatlabFunction.c" myMatlabFunction.c cl -c -nologo -GS -W4 -DWIN32 -D_MT -MTd -D_CRT_SECURE_NO_WARNINGS /Od /Oy- -DMODEL=myMatlabFunction -DHAVESTDIO -DUSE_RTMODEL @myMatlabFunction_rtw_comp.rsp -Fo"myMatlabFunction_main.obj" "H:\Examples\coder-ex19875030\myMatlabFunction_main.c" myMatlabFunction_main.c ### Creating standalone executable "H:\Examples\coder-ex19875030\myMatlabFunction.exe" ... link /MACHINE:X86 /DEBUG /DEBUGTYPE:cv /INCREMENTAL:NO /NOLOGO kernel32.lib ws2_32.lib mswsock.lib advapi32.lib -out:H:\Examples\coder-ex19875030\myMatlabFunction.exe @myMatlabFunction_rtw.rsp ### Created: H:\Examples\coder-ex19875030\myMatlabFunction.exe ### Successfully generated all binary outputs. myMatlabFunction(3.1416) = 6.2832
Чтобы отменить регистрацию цепочки инструментов, введите:
delete ./rtwTargetInfo.m RTW.TargetRegistry.getInstance('reset');