原文链接:https://developer.chrome.com/native-client/devguide/devcycle/vs-addin
注意:已针对ChromeOS以外的平台公布了此处所述技术的弃用。
请访问我们的 迁移指南 了解详情。
使用Visual Studio进行调试
无论您是移植现有项目还是从头开始,Native Client Visual Studio加载项都可以通过将Native Client SDK开发工具集成到Visual Studio环境中,更轻松地设置,构建,运行和调试Native Client应用程序。
Native Client加载项需要Visual Studio 2012或Visual Studio 2010 Service Pack 1.当前不支持其他版本的Visual Studio。Visual Studio Express也不受支持。
介绍
Visual Studio的Native Client加载项可帮助您以多种方式更有效地开发应用程序:
- 将代码组织和维护为Visual Studio项目。
- 迭代地更容易地编写和测试您的应用程序。Visual Studio处理启动Web服务器以提供模块的详细信息,并在Chrome中运行附带调试器的模块。
- 使用Visual Studio的C / C ++编译器将模块编译为动态链接库(DLL),并将其作为Pepper插件运行。这允许您逐步开发代码,一次编码和/或将一个功能移植到Pepper API中,同时继续使用本机Windows API,否则这些API将在实际的Native Client模块中不可用。
- 使用Visual Studio的内置调试器来调试代码,同时它作为Pepper插件运行。
- 使用Native Client SDK工具将模块编译为.nexe或.pexe文件,并将其作为真正的Native Client模块运行。
- 使用Native Client调试器nacl-gdb在代码作为Native Client对象运行时测试代码。
加载项定义了五种新的Visual Studio平台:PPAPI
,NaCl32
, NaCl64
,NaClARM
,和PNaCl
。这些平台可以应用于解决方案和项目的调试配置。平台配置项目的属性,以便可以构建和运行Pepper插件或Native Client模块。平台还定义与debug命令关联的行为,以便您可以在Visual Studio中运行时测试代码。
平台
将Visual Studio加载项平台分为两组是有帮助的。一个仅包含PPAPI平台。另一组,我们称之为本地客户端平台,包含了他们的名字,所有有“NaCl”平台: NaCl32
,NaCl64
,NaClARM
,和PNaCl
。下图显示了平台,它们通常使用的方式以及它们生成的构建产品。
使用平台,您的工作流程更快,更高效。您只需单击一下或按键即可编译,启动和调试代码。当您按F5“开始调试”命令时,Visual Studio会自动启动Web服务器以便为您的模块(如果需要)以及运行Native Client模块的Chrome实例提供服务,并且还会附加适当的调试器。
您可以在工作时切换平台,以比较代码的行为。
运行项目时,Visual Studio以不同方式启动PPAPI和Native Client平台,如下一节中所述。
PPAPI平台
PPAPI平台将您的模块构建为动态库,并启动Chrome版本,该版本配置为在遇到<embed>
元素时将库作为插件运行type=application/x-nacl
(忽略清单文件中的信息)。在PPAPI平台中运行时,您可以使用在构建并作为.nexe文件运行的常规Native Client模块中不可用的Windows系统调用。这提供了以递增方式移植现有代码的能力,一次使用PPAPI接口重写功能。由于该模块是使用Visual Studio的本机编译器(MSBuild)构建的,因此您可以使用Visual Studio调试器来控制和检查代码。
Native Client平台
有四个Native Client平台。所有这些都可用于构建Native Client模块。当您运行其中一个Native Client平台时,Visual Studio会构建相应类型的Native Client模块(.nexe或.pexe),启动Web服务器以提供它,并启动Chrome的一个副本,该模块从服务器并运行它。Visual Studio还将打开一个终端窗口,启动nacl-gdb实例,并将其附加到模块的进程,以便您可以使用gdb命令进行调试。
NaCl32和NaCl64
名为NaCl32和NaCl64的平台分别针对x86 32位和64位系统。当您准备好分发应用程序时,您需要两个平台来构建一整套.nexe文件。但请注意,在Visual Studio中进行测试时,必须选择NaCl64平台(因为Chrome for Windows在64位进程中运行Native Client)。如果您尝试从NaCl32平台运行,您将收到一条错误消息。
NaClARM
NaClARM平台针对基于ARM的处理器。您可以在Visual Studio中使用NaClARM平台构建.nexe文件,但不能从那里运行它们。您可以使用Visual Studio创建包含基于ARM的.nexe文件的Native Client模块,然后从ARM设备(例如较新的Chromebook计算机)上的Chrome浏览器运行该模块。有关在Chrome中测试模块的详细信息,请参阅运行Native Client应用程序中的说明 。
注意:NaClARM平台目前仅支持newlib工具链。
PNaCl
PNaCl(便携式NaCl)平台包含在Visual Studio Native Client加载项1.1及更高版本中。它支持.pexe文件格式。.pexe文件将您的应用程序编码为低级虚拟机(LLVM)的bitcode。将Native Client应用程序作为PNaCl模块传递时,清单文件将包含单个.pexe文件,而不是多个.nexe文件。Chrome客户端将LLVM bitcode转换为本地系统的机器指令。
从Visual Studio运行PNaCl平台时,Visual Studio使用Native Client SDK将.pexe文件转换为NaCl64 .nexe文件并运行它,就像使用NaCl64平台一样。
注意:PNaCl平台目前仅支持newlib工具链。
安装加载项
要使用Native Client Visual Studio加载项,您的开发环境应包括:
- 64位版本的Windows Vista或Windows 7。
- Visual Studio 2012或带Service Pack 1的Visual Service 2010。
- Chrome版本23或更高版本。您可以选择使用最新开发的金丝雀 Chrome浏览器构建,运行金丝雀版本并排侧(和分开)Chrome浏览器的普通版本。
- 包含
pepper_23
或更高版本的Native Client SDK。您使用的Chrome版本必须等于或大于SDK捆绑包的版本。
设置环境变量
在运行安装程序之前,必须定义两个Windows环境变量。它们指向您用于构建模块的Native Client SDK中的捆绑包,以及您选择用于调试的Chrome浏览器。
要在Windows 7中设置环境变量,请转到“开始”菜单并搜索“环境”。结果中的一个链接是“为您的帐户编辑环境变量。”(您也可以从Control Panel
下方链接到此链接User Accounts
。)单击在链接上并使用窗口中的按钮来创建或更改这些用户变量(以下显示的值仅作为示例):
变量名 | 描述 |
---|---|
NACL_SDK_ROOT |
SDK中的pepper目录的路径。例如:C:
acl_sdkpepper_23 |
CHROME_PATH |
您正在测试的Chrome版本的.exe文件的路径。例如:C:UsersfredAppDataLocalGoogleChrome SxSApplicationchrome.exe |
下载add-in
Native Client Visual Studio加载项是名为SDK的单独软件包 vs_addin
。打开命令提示符窗口,转到顶级SDK目录,然后运行update命令,指定加载项包:
naclsdk update vs_addin
这将创建一个名为的文件夹vs_addin
,其中包含加载项本身,安装程序文件和示例目录。
注意:只有naclsdk
在Windows系统上运行时,才会显示vs_addin软件包。
运行安装程序
安装程序脚本位于vs_addin
SDK中的文件夹内。右键单击该文件install.bat
并以管理员身份运行它。
该脚本始终安装NativeClient平台,并询问您是否还要安装PPAPI平台。您可以跳过PPAPI步骤并稍后再次运行安装程序以添加PPAPI平台。
您通常可以在没有参数的情况下成功运行安装程序 新平台安装在C:Program Files (x86)MSBuildMicrosoft.Cppv4.0Platforms
。
在某些情况下,系统资源可能不在其默认位置。运行时可能需要使用这些命令行参数install.bat
:
- 假定MSBuild文件夹位于
C:Program Files (x86)MSBuild
。您可以使用该标志指定备用路径--ms-build-path=<path>
。安装程序假定Visual Studio已在其中创建了用户文件夹 - 插件本身通常安装在
%USERPROFILE%My DocumentsVisual Studio 2012
(或2010年用于Visual Studio 2010)中。您可以使用--vsuser-path=<path>
标志指定备用路径。
有时可能会对Visual Studio加载项进行更新。更新的执行方式与安装类似。使用naclsdk update下载新的加载项并install.bat
以管理员身份运行。
要卸载加载项,请install.bat
以管理员身份运行并添加 --uninstall
标志。您需要以管理员身份运行命令提示符程序才能添加标志。转到Windows开始菜单,搜索“命令提示符”,右键单击该程序并以管理员身份运行它。
您可以通过在Visual Studio“工具”菜单中选择“加载项管理器”来验证是否已安装加载项并确定其版本。如果已安装加载项,它将显示在可用加载项列表中。选择它并阅读其描述。
尝试hello_world_gles
示例项目
该加载项附带一个examples目录。打开示例项目 exampleshello_world_gleshello_world_gles.sln
。该项目是一个显示旋转立方体的应用程序。
选择NaCl64平台
在Visual Studio中打开示例项目,选择Configuration Manager
,然后确认活动解决方案配置是否Debug
为活动项目平台NaCl64
。请注意,该hello_world_gles
项目的平台 也是NaCl64
。(您可以 Configuration Manager
从Build
菜单或项目Properties
窗口进入 。)
构建并运行项目
使用debugging命令(F5)构建并运行项目。随着车轮开始转动,您可能会收到一个或多个警报。他们是良性的; 您可以接受它们并设置选项以在可能的情况下忽略它们。您可能会看到的一些消息包括:
- “这个项目已经过时了,你想建立它吗?”
- “请指定用于调试会话的可执行文件的名称。”这应该是环境变量CHROME_PATH的值,它通常作为对话框中的默认值提供。
- “无法找到chrome.exe的调试信息。”这是预期的,您正在调试模块的代码,而不是Chrome。
- “打开文件 - 安全警告。无法验证发布者。“如果Visual Studio抱怨x86_64-nacl-gdb.exe,那就是我们的调试器。随它去。
一旦你通过这些障碍,应用程序就会开始运行,你会在三个地方看到活动:
- 终端窗口打开运行
nacl-gdb
。 - Chrome会在标签页中启动运行您的模块。
- 选择调试输出项时,Visual Studio输出窗口将显示调试消息。关闭Chrome窗口停止调试会话,或从调试菜单中选择停止调试命令。停止运行程序时,nacl-gdb窗口将关闭。
测试nacl-gdb调试器
在函数MainLoop中的SwapBuffers调用中添加一个断点,该函数位于hello_world.cc中。
再次启动调试器(F5)。这次将现有断点加载到nacl-gcb中,程序将在那里暂停。输入c继续运行。您可以使用gdb命令设置更多断点并逐步执行应用程序。有关详细信息,请参阅使用nacl-gdb进行调试(向下滚动到本节末尾以查看一些常用的gdb命令)。
测试Visual Studio调试器
如果您已安装PPAPI
平台,请返回Configuration Manager
并选择PPAPI
平台。这次Chrome启动 nacl-gdb
窗口时不会出现; Visual Studio调试器完全参与并在工作中。
检查平台属性
此时,查看与PPAPI和Native Client平台关联的属性可能会有所帮助 - 请参阅示例项目中的设置作为示例。
在Visual Studio中为Native Client开发
在安装了加载项并尝试了示例项目之后,您就可以开始使用自己的代码了。您可以通过使用自己的源代码替换源代码来重用示例项目及其已有的PPAPI和Native Client平台。更有可能的是,您将平台添加到现有项目或从头创建的新项目。
将平台添加到项目中
请按照以下步骤将Native Client和PPAPI平台添加到项目中:
- 打开配置管理器。
- 在与项目对应的行上,单击“平台”列下拉菜单,然后选择
<New...>
。 - 选择
PPAPI
,NaCl32
,NaCl64
,或PNaCl
在新的平台菜单。 - 在大多数情况下,您应该
<Empty>
在“从以下位置复制设置”菜单中进行选择。 切勿在``PPAPI``,``NaCl32``,``NaCl64``,``NaClARM``或``PNaCl``平台之间复制设置。您可以从Win32平台复制设置(如果存在),但之后确保为新平台正确设置项目属性,如下面的步骤6中所述。 - 如果您愿意,请选中“创建新的解决方案平台”框以创建除项目平台之外的解决方案平台。(这是可选的,但它可以很方便,因为它允许您通过选择具有相同名称的解决方案平台从Visual Studio主窗口切换项目平台。)
- 查看刚刚添加的新平台的项目属性。在大多数情况下,每个平台的默认属性应该是正确的,但检查是值得的。您可能已经预先设置或从Win32平台复制的自定义属性要特别小心。同时确认配置类型是否正确:
Dynamic Library
对于PPAPI
Application (.pexe)
对于PNaCl
Application (.nexe)
对NaCl32
,NaCl64
和NaClARM
选择工具链
直接从SDK构建Native Client模块时,可以使用两个不同的工具链newlib或glibc。有关两个工具链的说明以及如何使用glibc工具链构建和部署应用程序的说明,请参阅动态链接和使用glibc加载。Native Client平台为您提供相同的工具链选择。您可以在项目属性中指定要使用的工具链 Configuration Properties > General > Native Client > Toolchain
。
目前,NaClARM和PNaCl平台仅支持newlib工具链。
PPAPI平台没有工具链属性。PPAPI平台使用Visual Studio附带的工具链和库。
将库添加到项目中
如果您的Native Client应用程序需要SDK中未包含的库,则必须将它们添加到项目属性(下Configuration Properties > Linker > Input > Additional Dependencies
),就像任何其他Visual Studio项目一样。此依赖项列表是以分号分隔的列表。在PPAPI平台上,库名称包括.lib扩展名(例如,ppapi_cpp.lib;ppapi.lib
)。在Native Client平台上,扩展名被排除(例如ppapi_cpp;ppapi
)。
运行Web服务器
为了使Visual Studio加载项能够测试Native Client模块,您必须从Web服务器提供模块。有两种选择:
运行自己的服务器
当您开始调试运行时,Visual Studio会启动Chrome并尝试使用Chrome命令参数中的地址连接到Web服务器(请参阅项目的调试>命令配置属性),这通常是 localhost:$(NaClWebServerPort)
。如果您使用自己的服务器,请确保在命令arguments属性中指定其地址,并在启动调试会话之前确认您的服务器正在运行。还要确保服务器具有传送Native Client模块所需的所有文件(请参阅下面的“跟踪所有部分”)。
运行SDK服务器
如果指定端口上没有运行Web服务器,Visual Studio将尝试启动Native Client SDK附带的简单Python Web服务器。它在SDK本身(at %NACL_SDK_ROOT% oolshttpd.py
)和项目目录($(ProjectDir)/httpd.py
)中查找服务器的副本 。如果服务器位于其中一个位置,Visual Studio将启动服务器。服务器输出显示在Visual Studio的“输出”窗口中,位于名为“Native Client Web Server Output”的窗格中。以这种方式启动的服务器在调试会话结束时终止。
跟踪所有碎片
无论Web服务器在何处或如何启动,您都必须确保它具有您的应用程序所需的所有文件:
- 所有Native Client应用程序都必须具有html主页。通常会调用此文件
index.html
。主机页面必须具有其type属性设置为的embed标记application-type/x-nacl
。如果您计划使用Native Client平台,则embed标记还必须包含指向Native Client清单(.mnf)文件的src属性。 - 如果您使用的是Native Client平台,则必须包含有效的 清单文件。清单文件指向Visual Studio构建的.pexe或.nexe文件。这些将放在项目
General > Output Directory
配置属性中指定的目录中,通常是这样$(ProjectDir)$(ToolchainName)
。Visual Studio可以使用Native Client SDK脚本create_nmf.py为您自动生成清单文件。要使用此脚本,请将项目的Linker > General > Create NMF Automatically
属性设置为“是”。
如果您让Visual Studio发现并运行SDK服务器,则应将这些文件放在项目目录中。如果您正在运行自己的服务器,则必须确保主机页面index.html
位于服务器的根目录中。请记住,如果您使用的是其中一个Native Client平台,则必须可以从服务器访问清单文件和.pexe或.nexe文件的路径。
如果您的应用程序使用Native Client动态链接库的能力,则清单文件的结构可能会更复杂。您可能必须向清单文件添加有关动态链接库的其他信息,即使您自动创建它也是如此。在为动态链接的应用程序生成本机客户端清单文件中介绍了create_nmf工具的用法和限制。
您可以查看SDK中的示例项目,以了解索引和清单文件的组织方式。示例项目hello_nacl
还有一个名为的子目录hello_nacl
。该文件夹包含index.html
和hello_nacl.nmf
。nexe文件位于NaCl64
ewlibDebughello_nacl_64.nexe
。该hello_world_gles
示例项目包含一个名为的子目录hello_world_gles`。该目录包含使用工具链(index_glibc.html
和 index_newlib.html
)构建的html文件。.newe和.nmf文件位于newlib和glibc子文件夹中。有关Native Client应用程序部分的其他信息,请参阅应用程序结构。
使用调试器
PPAPI插件由Visual Studio的编译器(MSBuild)本机构建,并以通常的方式与Visual Studio的调试器一起使用。您可以在开始调试之前在Visual Studio源代码文件中设置断点,并在运行程序时即时设置。
无法从Visual Studio运行或调试NaCl32和NaClARM可执行文件(.nexe文件)。
NaCl64可执行文件(.nexe文件)使用SDK中的一个Native Client工具链进行编译,该工具链创建一个ELF格式的可执行文件。要调试正在运行的.nexe,必须使用nacl-gdb,它是一个不直接与Visual Studio集成的命令行调试器。当您启动从NaCl64平台运行的调试会话时,Visual Studio会自动为您启动nacl-gdb并将其附加到nexe。在开始调试之前在Visual Studio中设置的断点将自动传输到nacl-gdb。在NaCl调试会话期间,您只能使用nacl-gdb命令。
PNaCl平台生成.pexe文件。运行调试器时,加载项会将.pexe文件转换为.nexe文件,并运行附加了nacl-gdb的结果二进制文件。
有关nacl-gdb的其他信息,请参阅使用nacl-gdb进行调试(向下滚动到本节末尾以查看一些常用的gdb命令)。
请注意,您不能在Debug配置中使用Start Without Debugging命令(Ctrl + F5)和项目。如果您这样做,Chrome将会挂起,因为调试平台使用命令参数--wait-for-debugger-children
(在PPAPI中)或--enable-nacl-debug
(在Native Client平台中)启动Chrome 。这些标志会导致Chrome暂停并等待调试程序附加。如果您使用Start Without Debugging命令,则不会附加调试器,Chrome只会耐心等待。要使用Start Without Debugging,请切换到Release配置,或从Command Arguments
属性中手动删除有问题的参数。
禁用Chrome缓存
使用Native Client平台进行调试时,您可能希望禁用Chrome的缓存,以确保您正在测试最新且最好的代码。
关于PostMessage的警告
某些Windows库将符号定义PostMessage
为PostMessageW
。如果您正在使用PPAPI平台并且PostMessage()
在模块中使用Pepper 调用,这可能会造成严重破坏。当您在PPAPI平台上进行测试时,某些Pepper API头文件包含您可能需要的自我防御修复程序。这里是:
// If Windows defines PostMessage, undef it.
#ifdef PostMessage
#undef PostMessage
#endif
在Windows Studio中将Windows应用程序移植到Native Client
在Google I / O 2012上,我们演示了如何在60分钟内将Windows桌面应用程序移植到Native Client。该视频可在YouTube上观看。该vs_addin/examples
文件夹包含一对演示移植过程的简单示例。它们的设计仅需5分钟即可完成。这两个例子被称为hello_nacl
和 hello_nacl_cpp
。它们基本相同,但前者使用C PPAPI接口,而后者使用C ++ API。该应用程序是熟悉的“Hello,World”。
每个示例都以Win32
平台中运行的Windows桌面版本开头。从那里移动到PPAPI
平台,在那里执行一系列步骤来设置Native Client框架,使用它来运行桌面版本,然后将行为从Windows调用移植到PPAPI接口。你风与使用没有Windows功能,既可以在运行程序PPAPI
或NaCl64
平台。
示例项目使用单个源文件(hello_nacl.c
或 hello_nacl_cpp.cpp
)。移植过程中的每个步骤都是通过逐步定义源中的符号STEP1到STEP6来完成的。内联注释解释了每个连续步骤如何更改代码。查看示例代码以了解它是如何实际完成的。以下是该过程的摘要:
Win32平台
第1步运行桌面应用程序
首先在Win32平台上运行原始Windows应用程序。
PPAPI平台
STEP2使用空的Native Client模块启动Chrome
切换到PPAPI平台并包含初始化本机模块实例所需的代码。代码是无懈可击的,它只是初始化模块。此步骤说明了Visual Studio如何处理启动Web服务器和Chrome以及将Native Client模块作为Pepper插件运行的所有详细信息。
步骤3从Native Client模块同步运行桌面应用程序
Native Client直接创建窗口,然后调用WndProc来运行桌面应用程序。由于WndProc在其消息循环中旋转,因此初始化模块的调用永远不会返回。关闭Hello World窗口,模块初始化完成。
STEP4异步运行桌面应用程序和Native Client
在WndProc中,使用回调函数替换消息循环。现在,应用程序窗口和Native Client模块同时运行。
STEP5将输出重定向到网页
模块初始化代码调用initInstanceInBrowserWindow而不是initInstanceInPCWindow。WndProc已不再使用。相反,调用postMessage将文本(现在是“Hello,Native Client”)放在网页中,而不是打开和写入窗口。到达此步骤后,您可以一次开始将应用程序的各个部分移植到其中。
STEP6删除所有Windows代码
所有Windows代码都被删除,证明我们符合PPAPI标准。正在运行的功能代码与STEP5相同。
NaCl64平台
在NaCl64平台中运行Native Client模块
您仍在运行STEP6代码,但是作为Native Client模块而不是Pepper插件。
CC-By 3.0许可下提供的内容