exponenta event banner

Создание 32-разрядной DLL на 64-разрядной платформе Windows ® с помощью MSVC Toolchain

Зарегистрируйте и используйте цепочку инструментов Microsoft ® Visual C/C + + (MSVC), работающую на 64-разрядной платформе Windows ®, для компиляции 32-разрядной библиотеки динамических ссылок (DLL). В этом примере используется компилятор Microsoft ®. Однако концепции и интерфейс программирования применимы и к другим инструментальным цепям. После регистрации цепочки инструментов ее можно выбрать из списка, и генератор кода создаст файл make-файла для создания кода с помощью этой цепочки инструментов. Инструментальная цепочка состоит из нескольких инструментов, таких как компилятор, компоновщик и архиватор с несколькими различными опциями конфигурации. Инструментальная цепочка компилирует, связывает и запускает код на указанной платформе. Чтобы получить доступ к файлам, используемым в этом примере, щелкните Открыть сценарий.

Проверка платформы и определение версии MSVC

Этот код проверяет, поддерживается ли платформа и поддерживается ли версия 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);

Создание и настройка цепочки инструментов MSVC

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-разрядного аппаратного обеспечения

Для успешной генерации кода, совместимого с 32-разрядным оборудованием, созданный код должен использовать правильные базовые типы C (например, int, signed char, и другие). Эти типы являются основой для typedef операторы для типов размеров (например, uint8, int16, и другие). Настройте конфигурацию с помощью команды:

cfg.HardwareImplementation.ProdHWDeviceType = ...
    'Generic->Unspecified (assume 32-bit Generic)';

Настройка создания кода для использования 32-разрядной цепочки инструментов

Задайте имя 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

Чтобы использовать цепочку инструментов для создания кода и построения 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');

Связанные темы