用 C 语言开发 WSTP(Windows)

本文叙述了在微软 Windows 操作系统中如何编译和运行用 C 语言编写的 Wolfram Symbolic Transfer Protocol (WSTP) 程序.(WSTP 和外部程序的通讯叙述了如何用 Wolfram 语言和 C 语言编写 WSTP 程序.)本文还叙述了 WSTP 是如何在 Windows 中实现的.
本文并不教你如何使用编译器和其它开发工具,也不会教你如何用 C 语言编程或如何使用基于 Windows 的计算机. 本文假定你已经通读了你的开发工具所配套的介绍教程. 如果你有任何开发或运行 WSTP 程序的问题,请参阅本文末尾的疑难解答章节.
本文所叙述的大部分内容是专门面向 Windows 的. 若想学习如何在其它平台上编译和运行用 WSTP 程序,请参阅相关平台的开发指南.
概述
WSTP 是作为一组共享的动态链接库实现的. 当启动 WSTP 程序时,在磁盘上标准位置且由操作系统加载的共享库会绑定到 WSTP 程序的客户端,所以调用 WSTP 函数会指向共享库中的代码. 在运行 32 位 Windows 操作系统 (2000、 XP、Vista) 的计算机上,主共享库是 wstp32i4.dll.
在 Windows 64 位 平台 (XP 64、Server 2003、Vista 64、Windows 7、Windows 8) 中,64 位的 WSTP 程序的主共享库是 wstp64i4.dll.
当建立 WSTP 程序时,会使用导入库(一个 .lib 文件). 该导入库会加到项目文件中或包含在 makefile 的链接命令中. (该导入库不包含任何代码,它只是导出与共享库相同的函数名,以满足链接器.)
WSTP 的 C 接口在头文件 wstp.h 中指明. 此文件包含在任何调用 WSTP 共享库函数的 C 或 C++ 源文件中.
WSTP 程序运行时需要共享库 wstp32i4.dll 或 wstp64i4.dll,它们需要放置 Windows 操作系统可以找到的地方. 建立 WSTP 程序时需要导入库和头文件,它们需要放置在编译器和链接器可以找到的地方. 这些组件的安装和使用以及其它详细描述如下.
支持的开发平台
作为一个共享库,WSTP 可以用于任何符合标准调用约定和由微软指定的动态链接库 (DLL) 的二进制接口的开发环境. 但是,本文档仅描述如何使用 WSTP 在微软 C++ 开发环境下建立 C 程序.
每一个开发环境均支持项目文档,其中源文件和编译器、连接器和调试器的选项由项目窗口、对话框和其它互动界面元件来管理. 除了这个集成开发环境 (IDE),所有供应商均提供可以从命令提示符或由 make 工具程序调用的工具.
安装 WSTP 组件
本节介绍如何安装 WSTP 开发工具包的组件,使你可以构建和运行 WSTP 程序. 当你安装 Wolfram 系统时,WSTP 开发工具包已复制到你的硬盘上了.
下面的介绍假定 Windows 的 WSTP 开发工具包已由 Wolfram 系统的安装程序安装在 C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\. 对于 Windows,通常有两个开发工具包安装,其中用于 32 位 Windows 平台的工具包在名为 Windows 的文件夹中,用于 Windows 64 位平台的在一个名为 Windows-x86-64 的文件夹中. 如果你收到的开发工具包是一个与 Wolfram 系统独立的组成部分,复制文件夹 Windows 或 Windows-x86-64 到你的硬盘驱动器,例如到 C:\WSTP. 在这种情况下,你需要修改下面的安装说明,以反映你的开发工具包的位置.

建议安装

所有编译器的 SystemAdditions 安装

从 Wolfram 系统 10.0 版本之后,Wolfram 系统安装器不再在 Windows 系统目录下安装 WSTP 动态库. 作为一个 WSTP 开发人员,你需要将 WSTP 动态链接库 (DLL) 放在你的应用程序可以找到 DLL 的地方.
联系 微软开发人员中心 学习微软操作系统在启动程序时是如何搜索程序 DLL 的.

CompilerAdditions Installation for Microsoft Compilers

Visual Studio 2012
请注意,下面的说明假定你已经把微软的 Visual Studio 2012 安装在目录 C:\Program Files\Microsoft Visual Studio 11\VC. 这是 Developer Studio V11.0 的默认目录. 对于 Windows 64 位系统,Visual Studio 默认的安装目录是 C:\Program Files (x86)\Microsoft Visual Studio 11\VC.

1.  浏览到 Mathematica 安装的文件所在的 Windows\CompilerAdditions 文件夹(在 Windows 64 位系统则使用 Windows-x86-64\CompilerAdditions\ 文件夹). 你可以通过运行以下命令来打开一个包含这些文件夹的窗口.

explorer 这个词是可选的,但引号不是可选的.

2.  把文件 wstp32i4.lib、wstp32i4m.lib 和 wstp32i4s.lib 拷贝到 C:\Program Files\Microsoft Visual Studio 11\VC\lib. 注意对 Windows 64 位系统而言,这些文件的名字类似 wstp64i4*. 把 wstp.h 拷贝到 C:\Program Files\Microsoft Visual Studio 11\VC\include. 最后,把 wsprep.exe 拷贝到 C:\Program Files\Microsoft Visual Studio 11\VC\bin. 注意对 Windows 64 位系统而言,你要把目标路径改为 C:\Program Files (x86)\Microsoft Visual Studio 11\VC\lib\AMD64、C:\Program Files (x86)\Microsoft Visual Studio 11\VC\include 和 C:\Program Files (x86)\Microsoft Visual Studio 11\VC\bin.

Visual Studio 2010
请注意,下面的说明假定你已经把微软的 Visual Studio 2010 安装在目录 C:\Program Files\Microsoft Visual Studio 10\VC,这是 Developer Studio V10.0 的默认目录;对于Windows 64 位系统,Visual Studio 默认的安装目录是 C:\Program Files (x86)\Microsoft Visual Studio 10\VC.

1.  浏览到 Mathematica 安装的文件所在的 Windows\CompilerAdditions 文件夹(在 Windows 64 位系统则使用 Windows-x86-64\CompilerAdditions\ 文件夹). 你可以通过运行以下命令来打开一个包含这些文件夹的窗口.

explorer 这个词是可选的,但引号不是可选的.

2.  把文件 wstp32i4.lib、wstp32i4m.lib 和 wstp32i4s.lib 拷贝到 C:\Program Files\Microsoft Visual Studio 11\VC\lib. 注意对 Windows 64 位系统而言,这些文件的名字类似 wstp64i4*. 把 wstp.h 拷贝到 C:\Program Files\Microsoft Visual Studio 11\VC\include. 最后,把 wsprep.exe 拷贝到 C:\Program Files\Microsoft Visual Studio 11\VC\bin. 注意对 Windows 64 位系统而言,你要把目标路径改为 C:\Program Files (x86)\Microsoft Visual Studio 11\VC\lib\AMD64、C:\Program Files (x86)\Microsoft Visual Studio 11\VC\include 和 C:\Program Files (x86)\Microsoft Visual Studio 11\VC\bin.

WSTP 开发工具包的组成部分

WSTP 是一个分层的软件系统,包括独立于操作系统的组件和直接使用由操作系统提供的通信机制组件.
独立于系统的组件的主要作用是把表达式编码为一个字节字符串. 这个软件是在共享库 wstp32i4.dll(32 位程序)和 wstp64i4.dll(64 位程序)中实现的. 操作系统特定的组件的作用是把字节传送到另一个程序. 这项服务可能有几种实现方法. 每种实现被称为一个 WSTP 设备.

WSTP 共享库和头文件

下面是 Windows 的 WSTP 开发工具包中每个文件或目录的介绍. 请参阅建议安装安装这些组件.
Windows 64 位平台的 WSTP 开发工具包有类似的文件集,其主要的不同是组件的文件名不同. 其中,32 位 Windows 组件在组件文件名中包含 32,64 位版本在组件文件名中包含 64.

SystemAdditions 目录

在 SystemAdditions 目录中的文件是实现 WSTP 的共享库,通常安装在执行 WSTP 程序时系统能找到的地方.(请参阅 建议安装 安装这些组件.)大部分 WSTP 程序所需要的共享库在此目录的顶层. 32 位 Windows 的文件是 wstp32i4.dll. 64 位 Windows 的文件是 wstp64i4.dll.
wstp32i4.dll/wstp64i4.dll
wstp32i4.dll 或者 wstp64i4.dll 是 32 位 WSTP Windows 程序所使用的共享库(64 位 WSTP Windows 程序使用 wstp64i4.dll),它实现了 WSTP 应用程序编程接口 (API) 的接口 4. 应把它放在 32 位 WSTP 程序运行时,操作系统加载器能找到的地方.(不需要构建 32 位 WSTP 程序仅仅是为了运行.)你可以把该文件放在构建的 WSTP 程序中,或在Windows 的系统目录,或在 PATH 中. 请参阅以下更多信息和其它的安装选项.
WSTP 设备
所有 WSTP 设备都遵循一个命名格式,描述了它们所实现的协议和哪种类型的程序可能使用它们.
SharedMemory 设备
SharedMemory 是一个 WSTP 设备,使用 Win32 内存映射文件机制在进程间传递数据. 在 Wolfram 系统 10.0 中,它是本地连接的默认设备.
例如,C 程序
将连接执行下面命令的 Wolfram 语言程序:
TCPIP 设备
在 Wolfram 系统 10.0,TCPIP 设备是远程连接的偏好设备.
例如,C 程序
将连接执行下面命令的 Wolfram 语言程序:
LinkProtocol->"TCPIP" 可用于连接网络上运行在不同计算机上的 WSTP 程序.
IntraProcess 设备
IntraProcess 是一个 WSTP 设备,是为使用同样进程中的线程而设计. 当需要一个全双工 WSTP 连接至同样进程中的另一个线程时,使用该设备.
例如,C 程序
char* argv[] = {"-linkname", "abcdef_ipq", "-linkprotocol", "IntraProcess", "-linkmode", "connect"};
link = WSOpenArgv(stdenv, argv, argv + 6, 0);
会连接另一个执行下列指令的线程
char *argv[] = {"-linkname", "abcdef_ipq", "-linkprotocol", "IntraProcess", "-linkmode", "listen"};
link = WSOpenArgv(stdenv, argv, argv + 6, 0);
IntraProcess 不可以用于连接运行在不同进程中的链接.
FileMap 设备
FileMap 设备是一个废弃的 LinkProtocol,只适用于 Windows.
例如,C 程序
会连接执行下列指令的 Wolfram 语言程序:
当没有指明 LinkProtocol 时,默认情况下,WSTP 程序会使用这些设备.
Windows 64 位不支持 "FileMap" 协议.
TCP 设备
TCP 设备是废弃的 LinkProtocol,在进程间使用 TCP 互联网协议服务传递数据.
例如,C 程序
会连接执行下列命令的 Wolfram 语言程序:
"TCP" LinkProtocol 可用于连接网络中运行在不同计算机上的 WSTP 程序.
The "TCP" LinkProtocol 在 Mathematica 5.1 中已不推荐使用,它的存在为的是向后兼容性. "TCP" 用户应该将他们的代码转换为 "TCPIP".

CompilerAdditions 目录

Visual Studio 2012
CompilerAdditions\wstp.h
wstp.h 是一个必须包含在 C 和 C++ 源文件中的头文件. 它应该放在你的编译器可以找到的地方. 你可以把它复制到和源文件同样的目录下,或者复制到和开发工具所提供的标准头文件的同一目录下. 此外,你可以把 wstp.h 的位置添加到头文件的搜索路径.(这通常是通过一个命令行参数选项符、环境变量或设置对话框来完成.)
CompilerAdditions\wstp*i*.lib
*.lib 文件是导入的库,你的链接器将用它来连接你的代码中的引用和 WSTP 共享库文件中的函数. 其中一个 .lib 文件会被你的项目文件、makefile、或链接命令行引用. 因为导入库格式不是标准化的,每个最流行的开发环境会提供一个导入库.
wstp32i4m.lib 或者 wstp64i4m.lib 是微软 C/C++ 开发工具包括微软 Visual Studio 使用的导入库.(它是由微软链接器创建的一个 COFF 导入库.)应把他们放在微软链接器能找到的地方. 为了避免指定路径,你可以把文件放在 C:\Program Files\Microsoft Visual Studio 11\VC\PlatformSDK\lib 目录下. 把 64 位的 .lib 文件放在 C:\Program Files\Microsoft Visual Studio 11\VC\PlatformSDK\lib\AMD64 目录下.
CompilerAdditions\wsprep.exe
wsprep.exe 是一个 32 位的控制台程序 (console program),通过处理模板文件自动编写 WSTP 程序. 把该文件放在你的开发工具的Bin目录比较好. 在 Windows 64 位,wsprep.exe 是一个 64 位的控制台程序.
Visual Studio 2010
CompilerAdditions\wstp.h
wstp.h 是一个必须包含在 C 和 C++ 源文件中的头文件. 它应该放在你的编译器可以找到的地方. 你可以放置在和源文件同样的目录下,或者放在开发工具所提供的标准头文件的同一目录下. 此外,你可以把 wstp.h 的位置添加到头文件的搜索路径.(这通常是通过一个命令行参数选项符、环境变量或设置对话框来完成.)
CompilerAdditions\wstp*i*.lib
*.lib 文件是导入的库,你的链接器将用它来连接你的代码中的引用和 WSTP 共享库文件中的函数. 其中一个 .lib 文件会被你的项目文件、makefile、或链接命令行引用. 因为导入库格式不是标准化的,每个最流行的开发环境会提供一个导入库.
wstp32i4m.lib 或者 wstp64i4m.lib 是微软 C/C++ 开发工具包括微软 Visual Studio 使用的导入库.(它是由微软链接器创建的一个 COFF 导入库.)应把他们放在微软链接器能找到的地方. 为了避免指定路径,你可以把文件放在 C:\Program Files\Microsoft Visual Studio 10\VC\PlatformSDK\lib 目录下. 把 64 位的 .lib 文件放在 C:\Program Files\Microsoft Visual Studio 10\VC\PlatformSDK\lib\AMD64 目录下.
CompilerAdditions\wsprep.exe
wsprep.exe 是一个 32 位的控制台程序 (console program),通过处理模板文件自动编写 WSTP 程序. 把该文件放在你的开发工具的Bin目录比较好. 在 Windows 64 位,wsprep.exe 是一个 64 位的控制台程序.

PrebuiltExamples 目录

此文件夹包含示例程序的预建版本. 构建 WSTP 程序描述了如何使用WSTPExamples文件夹的源代码来自己构建程序. 运行 WSTP 程序描述了如何运行这些程序.

WSTPExamples 目录

此文件夹包含了一些非常简单的 WSTP 程序的源代码. 通过使用这些源代码,你可以学习如何构建和运行 WSTP 程序,而无需自己写代码.

其他组件目录

DebugLibraries 是一个"WSTPLibraries"的副本,进行广泛的错误检查并记录可能有用的信息. 如何使用这个程序库,请参阅疑难解答一节.
构建 WSTP 程序
构建 WSTP 程序的一般过程是:在那些调用 WSTP 函数的 C 或 C++ 源文件中包含 wstp.h,编译源文件,然后,把所产生的目标代码与 WSTP 导入库和任何其它你的应用程序所要求的标准库相链接. 如果你的应用程序使用 WSTP 模板机制,那么你的模板文件必须先用 wsprep 加工成 C 源文件. 几种常见的开发环境的细节如下.
使用微软Visual Studio 构建 WSTP 程序指南中假定你已经遵循了 WSTP 编译器补充安装说明. 如果你把编译器补充 (compiler additions) 放在硬盘的其它地方,你需要修改环境变量的设置,指明补充的命令行参数,或当提到 WSTP 编译器补充时要指定路径全名.

WSTP 版本

作为一个共享库,WSTP 的每个版本必须与先前版本兼容,有时还会添加新的功能. WSTP 采用一个简单的版本策略,能够适应许多编译和运行环境.

策略

WSTP 的发展是通过改进其实现方法和改善其接口推动的. 当做了改进且发布时,在 wstp.h 中定义的 WSREVISIONWSINTERFACE 值会增加.
WSREVISION 是当前版本号. 当改变源代码,重建 WSTP 和在任何平台上发布,版本号会递增.(修正错误、优化或其它和接口有关的改进都会增加该版本号.)
WSINTERFACE 是 WSTP 的文件接口名称. 该数字会递增,当增加、删除常量或函数,或其行为发生了变化,可能会打破存在的正确的客户程序. 随着时间的推移,WSTP 的接口会不断的改进,更高的接口数字意味着更完整或更易于编写高效的客户端程序. 尤其是,一个特定的接口提供了较早接口的所有有用的功能.
对于 Windows,WSTP 库函数的不同接口是用不同的共享库实现的. 文件 wstp32i4.dll 应用了最新的 WSTP 版本接口 4. 你只需在你的 Windows 文件夹中保留最新的版本(如共享库的属性框所示).
此外,每个 WSTP 接口有一个单独的导入库链接,因此,开发人员在编译时,应谨慎选择所使用的接口. 例如,使用微软 Visual Studio 的开发人员需要接口 4 的功能,则应链接到 wstp32i4m.lib,而不是不同接口的程序库文件.

使用 WSTP 模板文件

如果你的程序使用 WSTP 模板机制,如WSTP 和外部程序通讯所述,你必须使用 wsprep 控制台程序预处理包含模板项的源文件. 每个模板项是包含模板关键字的一系列行.(每个条目定义了一个 Wolfram 语言函数,计算时调用一个相关的 C 函数.) 当 wsprep 处理这种源文件时,它会把模板项转换成 C 函数,不修改其它文本并用 WSTP 远程过程调用机制写出其它 C 函数. 然后该 C 源文件就可以被编译了.
例如,命令:
会将 addtwo.tm 中的模板项和其它文本转换成 C 源文件 addtwotm.c. 然后你就可以用 C 编译器进行编译. 如果你使用 make 工具建立你的程序,你可以添加类似于以下的一个规则到你的 makefile 中.

使用微软 Visual Studio 构建 WSTP 程序

使用命令行工具

Visual Studio 2012
为了使用命令窗口的命令行工具,你必须运行该批处理文件 VCVARSALL.BAT 来配置环境. 你可以在 C:\Program Files\Microsoft Visual Studio 11\VC\VCVARSALL.BAT 找到该文件. 另外, 你可以使用 开始 所有程序 Microsoft Visual Studio 2012 Visual Studio Tools VS2012 x86 Native Tools Command Prompt 提供的快捷方式. VCVARSALL.BAT 接受该环境应使用何种编译工具的参数. 32 位 Windows 开发使用: VCVARSALL.BAT x86. Windows 64 位开发使用:VCVARSALL.BAT amd64. 在 Windows 64 位,你可以使用 开始 所有程序 Microsoft Visual Studio 2012 Visual Studio Tools VS2012 x64 Cross Tools Command Prompt 提供的快捷方式. 因为VCVARSALL.BAT 会正确配置 PATHINCLUDELIB 环境变量,所以你可以使用命令行环境下的微软编译工具.
建立一个由 Wolfram 语言内核调用的 WSTP 程序
建立 addtwo.exe 范例程序:

1.  运行 开始 所有程序 Microsoft Visual Studio 2012 Visual Studio Tools VS2012 x86 Native Tools Command Prompt (在 Windows 64 位使用 开始 所有程序 Microsoft Visual Studio 2012 Visual Studio Tools VS2012 x64 Cross Tools Command Prompt)启动命令提示符窗口.

2.  变换到 WSTPExamples 目录.

在 Windows 64 位下,使用下列命令:

C:
cd "C:\Program Files\Wolfram Research\Mathematica\11.0\"
cd SystemFiles\Links\WSTP\DeveloperKit\Windows-x86-64\WSTPExamples\

在某些版本的 Windows 下,你可能需要拷贝 WSTPExamples 目录中的内容到你有编写权限的文件系统中的文件夹.

3.  敲入下列五条命令.

在 Windows 64 位下,最后一行使用下列命令:

LINK addtwo.obj addtwotm.obj wstp64i4m.lib /OUT:addtwo.exe
建立一个调用 Wolfram 语言内核的 WSTP 程序
建立 factor.exe 范例程序:

4.  运行 开始 所有程序 Microsoft Visual Studio 2012 Visual Studio Tools VS2012 x86 Native Tools Command Prompt (在 Windows 64 位使用 开始 所有程序 Microsoft Visual Studio 2012 Visual Studio Tools VS2012 x64 Cross Tools Command Prompt)启动命令提示符窗口.

5.  变换到 WSTPExamples 目录.

在 Windows 64 位下,使用下列命令:

C:
cd "C:\Program Files\Wolfram Research\Mathematica\11.0\"
cd SystemFiles\Links\WSTP\DeveloperKit\Windows-x86-64\WSTPExamples\

在某些 Windows 版本,你可能需要拷贝 WSTPExamples 目录中的内容到你有编写权限的文件系统中的文件夹.

6.  输入下列四条命令.

在 Windows 64 位下,最后一行使用下列命令:

LINK factor.obj wstp64i4m.lib /OUT:factor.exe
调试一个由 Wolfram 语言内核调用的 WSTP 程序
建立 addtwo.exe 的调试版本:

7.  按照建立一个由 Wolfram 语言内核调用的 WSTP 程序中的步骤 13,但步骤 3 使用下列命令.

在 Windows 64 位下,最后一行使用下列命令:

LINK addtwo.obj addtwotm.obj wstp64i4m.lib /OUT:addtwo.exe

调试 addtwo.exe:

8.  启动微软 Visual Studio.

9.  文件 菜单中选择 打开 项目/方案.

会出现 打开项目 对话框.

10.  从文件类型下拉列表中选择 可执行项目文件 (*.exe) 以便在文件选择器窗格中显示 .exe 文件.

11.  选择包含 addtwo.exe 的驱动器和目录.

12.  选择 addtwo.exe 且点击 打开 按钮.

13.  F5 或选择 调试 菜单下的 开始调试 命令开始调试.

当你完成调试并关闭该项目的解决方案时,你将被询问是否要保存 addtwo.exe 的新的解决方案, 如果你想保留你的断点和其他调试器设置请选择 确定.

调试一个调用 Wolfram 语言内核的 WSTP 程序
建立 factor.exe 的调试版本:

14.  按照建立一个由 Wolfram 语言内核调用的 WSTP 程序中的步骤 13,但步骤 3 使用下列命令.

在 Windows 64 位下,最后一行使用下列命令:

LINK factor.obj wstp64i4m.lib /OUT:factor.exe
调试 factor.exe:

15.  启动微软 Visual Studio.

16.  文件 菜单中选择 打开 项目/方案.

会出现 打开项目 对话框.

17.  从文件类型下拉列表中选择 可执行项目文件(*.exe) 以便在文件选择器窗格中显示 .exe 文件.

18.  选择包含 factor.exe 的驱动器和目录.

19.  选择 factor.exe 且点击 打开 按钮.

20.  项目 菜单选择 属性.

会出现项目设置页面.

21.  参数 部分,点击 自变量 文本框并输入:-linklaunch.

22.  点击 确定 按钮.

23.  F5 或选择 调试 菜单下的 开始调试 命令开始调试.

24.  当执行 WSOpenArgcArgv() 时,会出现 选择 WSTP 程序 对话框. 打开 MathKernel.exe.

当你完成调试并关闭该项目的解决方案时,你将被询问是否要保存 factor.exe 的新的解决方案, 如果你想保留你的断点和其他调试器设置请选择 确定.

Visual Studio 2010
为了使用命令窗口的命令行工具,你必须运行批处理文件 VCVARSALL.BAT 来配置环境. 你可以在 C:\Program Files\Microsoft Visual Studio 10\VC\VCVARSALL.BAT 找到该文件. 另外, 你可以使用 开始 所有程序 Microsoft Visual Studio 2010 Visual Studio Tools Visual Studio Command Prompt (2010) 提供的快捷方式. VCVARSALL.BAT 接受该环境应使用何种编译工具的参数. 32 位 Windows 开发使用: VCVARSALL.BAT x86. Windows 64 位开发使用:VCVARSALL.BAT amd64. 在 Windows 64 位,你可以使用 开始 所有程序 Microsoft Visual Studio 2010 Visual Studio Tools Visual Studio x64 Win64 Command Prompt (2010) 提供的快捷方式. 因为VCVARSALL.BAT 会正确配置 PATHINCLUDELIB 环境变量,所以你可以使用命令行环境下的微软编译工具.
建立一个由 Wolfram 语言内核调用的 WSTP 程序
建立 addtwo.exe 范例程序:

1.  运行 开始 所有程序 Microsoft Visual Studio 2010 Visual Studio Tools Visual Studio Command Prompt (2010) (在 Windows 64 位使用 开始 所有程序 Microsoft Visual Studio 2010 Visual Studio Tools Visual Studio x64 Win64 Command Prompt (2010))启动命令提示符窗口.

2.  变换到 WSTPExamples 目录.

在 Windows 64 位下,使用下列命令:

C:
cd "C:\Program Files\Wolfram Research\Mathematica\11.0\"
cd SystemFiles\Links\WSTP\DeveloperKit\Windows-x86-64\WSTPExamples\

在某些 Windows 版本,你可能需要拷贝 WSTPExamples 目录中的内容到你有编写权限的文件系统中的文件夹.

3.  敲入下列五条命令.

在 Windows 64 位下,最后一行使用下列命令:

LINK addtwo.obj addtwotm.obj wstp64i4m.lib /OUT:addtwo.exe
建立一个调用 Wolfram 语言内核的 WSTP 程序
建立 factor.exe 范例程序:

4.  运行 开始 所有程序 Microsoft Visual Studio 2010 Visual Studio Tools Visual Studio Command Prompt (2010) (在 Windows 64 位使用 开始 所有程序 Microsoft Visual Studio 2010 Visual Studio Tools Visual Studio x64 Win64 Command Prompt (2010))启动命令提示符窗口.

5.  变换到 WSTPExamples 目录.

在 Windows 64 位下,使用下列命令:

C:
cd "C:\Program Files\Wolfram Research\Mathematica\11.0\"
cd SystemFiles\Links\WSTP\DeveloperKit\Windows-x86-64\WSTPExamples\

在某些 Windows 版本,你可能需要拷贝 WSTPExamples 目录中的内容到你有编写权限的文件系统中的文件夹.

6.  输入下列四条命令.

在 Windows 64 位下,最后一行使用下列命令:

LINK factor.obj wstp64i4m.lib /OUT:factor.exe
调试一个调用 Wolfram 语言内核的 WSTP 程序
建立 addtwo.exe 的调试版本:

7.  按照"建立一个由 Wolfram 语言内核调用的 WSTP 程序 中的步骤 13,但步骤 3 使用下列命令.

在 Windows 64 位下,最后一行使用下列命令:

LINK addtwo.obj addtwotm.obj wstp64i4m.lib /OUT:addtwo.exe

调试 addtwo.exe:

8.  启动微软 Visual Studio.

9.  文件 菜单中选择 打开 项目/方案.

会出现 打开项目 对话框.

10.  从文件类型下拉列表中选择 可执行项目文件(*.exe) 以便在文件选择器窗格中显示 .exe 文件.

11.  选择包含 addtwo.exe 的驱动器和目录.

12.  选择 addtwo.exe 且点击 打开 按钮.

13.  F5 或选择 调试 菜单下的 开始调试 命令开始调试.

当你完成调试并关闭该项目的解决方案时,你将被询问是否要保存 addtwo.exe 的新的解决方案, 如果你想保留你的断点和其他调试器设置请选择 确定 .

调试一个调用 Wolfram 语言内核的 WSTP 程序
建立 factor.exe 的调试版本:

14.  按照建立一个由 Wolfram 语言内核调用的 WSTP 程序中的步骤 13,但步骤 3 使用下列命令.

在 Windows 64 位下,最后一行使用下列命令:

LINK factor.obj wstp64i4m.lib /OUT:factor.exe
调试 factor.exe:

15.  启动微软 Visual Studio.

16.  文件 菜单中选择 打开 项目/方案.

会出现 打开项目 对话框.

17.  从文件类型下拉列表中选择 可执行项目文件(*.exe) 以便在文件选择器窗格中显示 .exe 文件.

18.  选择包含 factor.exe 的驱动器和目录.

19.  选择 factor.exe 且点击 打开 按钮.

20.  项目 菜单选择 属性.

会出现项目设置页面.

21.  参数 部分,点击 自变量 文本框并输入:-linklaunch.

22.  点击 确定 按钮.

23.  F5 或选择 调试 菜单下的 开始调试 命令开始调试.

24.  当执行 WSOpenArgcArgv() 时,会出现 选择 WSTP 程序 对话框. 打开 MathKernel.exe.

当你完成调试并关闭该项目的解决方案时,你将被询问是否要保存 factor.exe 的新的解决方案, 如果你想保留你的断点和其他调试器设置请选择 确定.

编译器参数选项符简短摘要
参数选项符
行为
/nologo
不显示版权提示
/W3
显示延伸的警告
/Z7
在对象文件中存储调试信息
/Zi
在一个独立的项目数据库文件中存储调试信息
/Fdaddtwo.pdb
指定项目的数据库文件的名称,和 /Zi 一起使用
/Od
关闭优化(缺省)
/O2
对于小型代码优化器倾向于更快的编码
/D
一些标准头文件和 wstp.h 使用的定义
/c
无链接编译
@filename
从文件中读取更多命令行参量
CFLAGS
包含更多命令行参数的环境变量
链接器参数选项符简短摘要
参数选项符
行为
/NOLOGO
不显示版权提示
/DEBUG
在可执行或项目数据库中存储调试信息
/PDB:NONE
在可执行数据库中存储调试信息,和 /DEBUG 一起使用
/PDB:addtwo.pdb
覆盖项目数据库的默认名称
/OUT:addtwo.exe
命名输出文件
/INCREMENTAL:no
连接更慢,但让事件更小,更简洁
/SUBSYSTEM:windows
(当 WinMain()定义,默认情况下)该应用程序不需要控制台(console),因为它会创建自己的窗口
/SUBSYSTEM:console
(当 main() 有定义,默认情况下)提供一个控制台(console)
标准的系统程序库
导入库
基本的系统服务
kernel32.lib
基本的操作系统支持,如文件系统、进程间通信、过程控制、内存和控制台
advapi32.lib
支持安全和注册表调用
导入库
用户界面 (GUI) 系统服务
user32.lib
支持用户界面,诸如,视窗、信息、菜单、控制和对话框
gdi32.lib
支持文本和图形绘制
winspool.lib
支持打印和打印工作
comdlg32.lib
支持例如打开、保存文件和打印的通用对话框
导入库
命令解释程序 (Shell) 系统服务
shell32.lib
支持拖放,可执行文件和文件扩展名间的关联以及从可执行文件中提取图标
导入库
对象链接与嵌入 (OLE) 系统服务
ole32.lib
支持 OLE v2 .1
oleaut32.lib
支持 OLE 自动化
uuid.lib
支持在 OLE 和 RPC(静态库)中使用的通用唯一标识符
导入库
数据库系统服务
odbc32.lib
通过 ODBC 进入数据库管理系统
odbccp32.lib
ODBC 设置和管理

使用程序编译工具 NMAKE

NMAKE 是微软开发工具中提供的一个实用程序,管理建立程序的过程. NMAKE 读取 makefile,它描述了建立和重建一个或多个程序的依赖关系和命令. 当更新一个或多个先决条件文件时,NMAKE 重建任何已过期的组成部分. 本文档没有详细描述 NMAKE 或 makefile. 这里所提供的一个简单的 makefile,描述了上述建立命令如何通过在命令提示符下输入 NMAKE 自动执行. 要了解有关 NMAKE 的更多信息、通用的强大机制,以及如何使用宏或特殊形式,请参阅微软 Visual Studio 指南中的 NMAKE 部分.
Visual Studio 2012
使用 Makefile 建立使用 WIN32 API 的模板程序
使用 NMAKE 实用程序建立 addtwo.exe:

1.  使用文本编辑器,创建包含下列文本的文件.

2.  在 WSTPExamples 目录中把文件另存为 addtwo.mak.

3.  运行 Start All Programs Microsoft Visual Studio 2012 Visual Studio Tools VS2012 x86 Native Tools Command Prompt (在 Windows 64 位使用 Start All Programs Microsoft Visual Studio 2012 Visual Studio Tools VS2012 x64 Cross Tools Command Prompt)) 启动命令提示符窗口.

4.  切换到 addtwo 目录.

5.  输入以下命令.

Makefiles 文件包括建立一个规则、宏和其它特殊形式的集合.
建立规则包含一个目标文件,后跟一个冒号,一个目标的先决条件的文件列表(这些文件必须存在或可以在 makefile 中由其它规则建立),一条或多条缩进行,其中包含从其先决条件建立目标所需要的命令. 例如,上述 makefile 指出文件 addtwotm.c 依赖 addtwo.tm,任何时候修改 addtwo.tm 均要重建 addtwotm.c. 使用命令 wsprep addtwo.tm -o addtwotm.c 重建目标文件 "addtwotm.c".
宏是被命名的文本字符串,可以使用 插入到 makefile. 例如,在 makefile 中,当 $(CFLAGS)出现在字符串/nologo /c /W3 /Z7 /Od /DWIN32 /D_DEBUG /D_WINDOWS 时,会被 NMAKE 扩展.
你可能希望编译 addtwo.c 的命令在 makefile 中以类似 CL $(CFLAGS) addtwo.c 的简单形式出现,如果这样你就有可能需要编辑 CFLAGS 的定义,但由此产生的编译器命令就可能超过一个命令行所允许的最大的长度. 因为命令行往往受长度限制,所以命令行工具通常提供一种从所谓的响应文件中读取命令行参数的方法. 语法通常是 . 这种方法和 NMAKE 一起使用产生下列特殊形式的临时文件:
<<
放在临时文件中的文本
<<
使用 Makefile 建立控制台 (Console) 程序
使用 NMAKE 实用程序建立 factor.exe:

6.  使用文本编辑器,创建包含下列文本的文件.

7.  在 WSTPExamples 目录中保存该文件为 factor.mak.

8.  运行 开始 所有程序 Microsoft Visual Studio 2012 Visual Studio Tools VS2012 x86 Native Tools Command Prompt(在 Windows 64 位使用 开始 所有程序 Microsoft Visual Studio 2012 Visual Studio Tools VS2012 x64 Cross Tools Command Prompt)启动命令提示符窗口.

9.  切换到 factor 目录.

10.  输入以下两条命令.

Visual Studio 2010
使用 Makefile 构建一个使用 WIN32 API 的模板程序
使用 NMAKE 实用程序建立 addtwo.exe:

1.  使用文本编辑器,创建包含下列文本的文件.

2.  在 WSTPExamples 目录中保存该文件为 addtwo.mak.

3.  运行 Start All Programs Microsoft Visual Studio 2010 Visual Studio Tools Visual Studio Command Prompt (2010) (在 Windows 64 位使用 Start All Programs Microsoft Visual Studio 2010 Visual Studio Tools Visual Studio x64 Win64 Command Prompt (2010)) 启动命令提示符窗口.

4.  切换到 addtwo 目录.

5.  输入以下命令.

Makefiles 文件包括建立一个规则、宏和其它特殊形式的集合.
建立规则包含一个目标文件,后跟一个冒号,一个目标的先决条件的文件列表(这些文件必须存在或可以在 makefile 中由其它规则建立),一条或多条缩进行,其中包含从其先决条件建立目标所需要的命令. 例如,上述 makefile 指出文件 addtwotm.c 依赖 addtwo.tm,任何时候修改 addtwo.tm 均要重建 addtwotm.c. 使用命令 wsprep addtwo.tm -o addtwotm.c 重建目标文件 addtwotm.c.
宏是被命名的文本字符串,可以使用 插入到 makefile. 例如,在 makefile 中,当 $(CFLAGS)出现在字符串/nologo /c /W3 /Z7 /Od /DWIN32 /D_DEBUG /D_WINDOWS 时,会被 NMAKE 扩展.
你可能希望编译 addtwo.c 的命令在 makefile 中以类似 CL $(CFLAGS) addtwo.c 的简单形式出现,如果这样你就有可能需要编辑 CFLAGS 的定义,但由此产生的编译器命令就可能超过一个命令行所允许的最大的长度. 因为命令行往往受长度限制,所以命令行工具通常提供一种从所谓的响应文件中读取命令行参数的方法. 语法通常是 . 这种方法和 NMAKE 一起使用产生下列特殊形式的临时文件:
<<
放在临时文件中的文本
<<
使用 Makefile 建立控制台 (Console) 程序
使用 NMAKE 实用程序建立 factor.exe:

6.  使用文本编辑器,创建包含下列文本的文件.

7.  在 WSTPExamples 目录中保存该文件为 factor.mak.

8.  运行 开始 所有程序 Microsoft Visual Studio 2010 Visual Studio Tools Visual Studio Command Prompt (2010)(在 Windows 64 使用 开始 所有程序 Microsoft Visual Studio 2010 Visual Studio Tools Visual Studio x64 Win64 Command Prompt (2010))启动命令提示符窗口.

9.  切换到 factor 目录.

10.  输入以下两条命令.

使用 Visual Studio 2012 集成开发环境

所有项目共同的步骤
在 Microsoft Visual Studio 2012 中使用 WSTP 所需的步骤:

1.  从 WSTP 开发工具包中把 wstp.h 复制到 Microsoft Visual Studio 2012 的 Include 目录.

32位 Windows

32 位 Windows 开发工具包路径:C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows\CompilerAdditions\wstp.h

32 位 Windows 的 Visual Studio 2012 Include 目录:C:\Program Files\Microsoft Visual Studio 11\VC\Include

64位 Windows

Windows 64 位开发工具包路径:C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows-x86-64\CompilerAdditions\wstp.h

Windows 64 位的 Visual Studio 2012 Include 目录:C:\Program Files (x86)\Microsoft Visual Studio 11\VC\Include

2.  把 .lib 文件复制到 Microsoft Visual Studio Lib 目录.

32位 Windows

从: C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows\CompilerAdditions\*.lib 把 wstp32i4m.lib 复制到 C:\Program Files\Microsoft Visual Studio 11\VC\Lib

64位 Windows

从: C:\Program Files\Wolfram Research\Mathematica\11.0\AddOns\WSTP\DeveloperKit\Windows-x86-64\CompilerAdditions\*.lib 把 wstp64i4m.lib 复制到 C:\Program Files (x86)\Microsoft Visual Studio 11\VC\Lib\AMD64

3.  复制 wsprep.exe.

32位 Windows

复制从: C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows\CompilerAdditions\wsprep.exe 到: C:\Program Files\Microsoft Visual Studio 11\VC\bin

64位 Windows

复制从: C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows-x86-64\CompilerAdditions\wsprep.exe 到: C:\Program Files (x86)\Microsoft Visual Studio 11\VC\bin\amd64

创建 addtwo.exe 项目
创建一个可用于编辑、构建和调试 addtwo.exe 的项目方案:

1.  启动 Microsoft Visual Studio 2012.

2.  点击 文件 新建 项目.

出现 新项目 对话框.

3.  选择 Installed Templates Visual C++ 并点击 Win32 Project 图标. (在 Visual Studio 2012 更新 3,有一个错误会阻止 Win32 项目与如下所述的自定义生成工具和自定义生成步骤的正常工作. 如果使用 Win32 项目,遇到问题,则使用 Win32 Console Application 项目图标.)

4.  位置 文本框中敲入:

C:\users\<username>\documents\visual studio 2012\Projects

名字 文本框中敲入 addtwo.

点击 确定.

出现 Win32 应用程序向导 对话框.

5.  点击 应用程序设置. 在 附加选项 下选择 空白项目 文本框. 点击 完成.

6.  不选 Security Development Lifecycle checks 复选框. 点击 完成.

7.  若要构建 addtwo 的64位版本,点击 Win32 下拉菜单并选择 配置管理器.

出现 配置管理器 对话框.

Active solution platform,选择下拉菜单并点击 New.

会出现 New Solution Platform 对话框.

设置 New Platform: 下拉菜单中的 x64,Copy settings from: 下拉菜单的 Win32.

点击 OK/Close 关闭对话窗口.

点击 Win32 下拉菜单并选择 x64.

8.  解决方案资源管理 单击一下选择 addtwo 项目. 从 项目 菜单中选择 项目 添加存在项.

出现 添加存在项 对话框.

9.  使用文件选择器窗格浏览至下列目录:

32位 Windows

C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows\WSTPExamples

64位 Windows

C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows-x86-64\WSTPExamples

10.  文件名称: 文本框中输入 "addtwo.c" "addtwo.tm" (由空格分开). 点击 增加.

11.  能会出现提示框询问你是否要创建一个新规则建立 .tm 文件. 点击 .

12.  解决方案资源管理 中把 addtwo.tm 文件拖入到 源文件 文件夹.

13.  解决方案资源管理 单击一下选择 addtwo 项目. 从 项目 菜单中选择 项目 添加存在项.

出现 添加新项 对话框.

位置 文本框中敲入:

C:\Users\<username>\documents\visual studio 2012\Projects\addtwo

点击 C++ File (.cpp).

名字: 文本框中输入: addtwotm.c.

点击 增加.

关闭在文件编辑器窗格中打开的 addtwotm.c 文件编辑器.

14.  解决方案资源管理 中右击 addtwo 项目,选择 属性.

15.  点击 配置属性 旁的 扩展树 图标.

16.  点击 Linker 旁的 Expand Tree 按钮.

17.  点击 输入.

18.  附加依赖 文本框中输入 wstp32i4m.lib.

点击 OK.

对于 Windows 64 位,输入 wstp64i4m.lib.

19.  解决方案资源管理 中点击 addtwo.tm. 从 项目 菜单选择 项目 添加存在项.

出现 addtwo.tm 属性页面 对话框.

20.  点击 配置属性 旁的 扩展树 图标.

21.  点击 General.

22.  Item Type 下拉变为 Custom Build Tool.

23.  点击 Custom Build Tool 旁的 Expand Tree 按钮.

24.  点击 General.

25.  命令行最右边的窗格中,单击空框,在该文本框中键入(包括引号): "$(VCInstallDir)\bin\wsprep.exe" "%(FullPath)" -o "$(ProjectDir)..\addtwotm.c".

64位 Windows

对于 Windows 64 位使用:"$(VCInstallDir)\bin\amd64\wsprep.exe" "%(FullPath)" -o "$(ProjectDir)..\addtwotm.c".

26.  输出 文本框中键入:..\addtwotm.c.

点击 OK.

27.  解决方案资源管理 中右击 addtwo 项目,然后选择 属性.

28.  点击 配置属性 旁的 Expand Tree 图标.

29.  点击 General.

30.  点击 Project Defaults 扩展树按钮.

31.  设置下拉菜单为 Not Set,而不是 Character Set.

点击 OK.

32.  Build 菜单中选择 Build Build Solution. 如果你遇到如下所示的链接器错误,那么你需要变换到如前所示的 Win32 Console Application 项目设置:

1>------ Build started: Project: addtwo, Configuration: Debug x64 ------
1> addtwo.c
1>MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol main referenced in function __tmainCRTStartup
1>c:\users\steve\documents\visual studio 2012\Projects\addtwo\x64\Debug\addtwo.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

你必须编辑文件 addtwo.c 并改变行 25,从:

#if WINDOWS_WSTP

#if 0 && WINDOWS_WSTP

保存 addtwo.c 并再次运行 Build Build Solution.

33.  现在 addtwo.exe 的二进制文件在:

32位 Windows

C:\users\<username>\documents\visual studio 2012\Projects\addtwo\addtwo\Debug

64位 Windows

C:\users\<username>\documents\visual studio 2012\Projects\addtwo\addtwo\x64\Debug

创建 factor.exe 项目
创建一个可用于编辑、构建和调试 factor.exe 的项目方案:

1.  启动 Microsoft Visual Studio 2012.

2.  点击 File New Project.

出现 New Project 对话框.

3.  选择 Installed Templates Visual C++ 并点击 Win32 Console Application 图标.

4.  Location 文本框中输入:

C:\users\<username>\documents\visual studio 2012\Projects

Name 文本框,输入 factor.

点击 OK.

出现 Win32 Application Wizard 对话框.

5.  点击 Application Settings. 在 Additional options 设置中,点击 Empty Project 文本框.

6.  不选 Security Development Lifecycle checks 复选框. 点击 Finish.

7.  若要构建64位版本的 factor,点击 Win32 下拉菜单并选择 Configuration.

出现 Configuration Manager 对话框.

Platform 下,选择下拉菜单并点击 New.

会出现 New Project Platform 对话框.

设置 New Platform: 将下拉菜单设为 x64Copy settings from: 设为 Win32.

点击 OK 关闭对话窗口.

点击 Win32 下拉菜单并选择 x64.

8.  Solution Explorer 单击一下选择 factor 项目. 从 Project 菜单中选择 Project Add Existing Item.

出现 Add Existing Item 对话框.

9.  Look in 下拉菜单中选择如下目录:

32位 Windows

C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows\WSTPExamples

64位 Windows

C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows-x86-64\WSTPExamples

10.  File name: 文本框中输入: factor.c.

点击 Add.

11.  右击 Solution Explorer 中的 factor 项目,然后选择 Properties.

12.  点击 Configuration Properties 旁的 Expand Tree 图标.

13.  点击 Linker 旁的 Expand Tree 图标.

14.  点击 Input.

15.  Additional Dependencies 文本框中输入 wstp32i4m.lib.

点击 OK.

对于 Windows 64 位,输入 wstp64i4m.lib.

16.  Build 菜单中选择 Build Build Solution.

17.  现在 factor.exe 二进制文件在:

32位 Windows

C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows\WSTPExamples\Debug

64位 Windows

C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows-x86-64\WSTPExamples\Debug

使用 Visual Studio 2010 集成开发环境

所有项目共同的步骤
在 Microsoft Visual Studio 2010 中使用 WSTP 所需的步骤:

1.  从 WSTP 开发工具包中把 wstp.h 复制到 Microsoft Visual Studio 2010 的 Include 目录.

32位 Windows

32 位 Windows 开发工具包路径:C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows\CompilerAdditions\wstp.h

32 位 Windows 的 Visual Studio 2010 Include 目录:C:\Program Files\Microsoft Visual Studio 10\VC\Include

64位 Windows

Windows 64 位开发工具包路径:C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows-x86-64\CompilerAdditions\wstp.h

Windows 64 位的 Visual Studio 2010 Include 目录:C:\Program Files (x86)\Microsoft Visual Studio 10\VC\Include

2.  把 .lib 文件复制到 Microsoft Visual Studio Lib 目录.

32位 Windows

从: C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows\CompilerAdditions\ 把 wstp32i4m.lib 复制到 C:\Program Files\Microsoft Visual Studio 10\VC\Lib

64位 Windows

从: C:\Program Files (x86)\Wolfram Research\Mathematica\11.0\AddOns\WSTP\DeveloperKit\Windows-x86-64\CompilerAdditions\ 把 wstp64i4m.lib 复制到 C:\Program Files (x86)\Microsoft Visual Studio 10\VC\Lib\amd64

3.  复制 wsprep.exe.

32位 Windows

复制从: C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows\CompilerAdditions\wsprep.exe 到: C:\Program Files\Microsoft Visual Studio 10\VC\bin

64位 Windows

复制从: C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows-x86-64\CompilerAdditions\wsprep.exe 到: C:\Program Files (x86)\Microsoft Visual Studio 10\VC\bin\amd64

创建 addtwo.exe 项目
创建一个可用于编辑、构建和调试 addtwo.exe 的项目方案:

1.  启动 Microsoft Visual Studio 2010.

2.  点击 文件 新建 项目.

出现 新项目 对话框.

3.  Installed Templates,选择 Visual C++ Win32 并点击 Win32 Project 图标.

4.  位置 文本框中敲入:

C:\users\<username>\documents\visual studio 2010\Projects

名字 文本框中敲入 addtwo.

点击 确定.

出现 Win32 应用程序向导 对话框.

5.  点击 应用程序设置. 在 附加选项 下选择 空白项目 文本框. 点击 完成.

6.  若要构建 addtwo 的64位版本,点击 Win32 下拉菜单并选择 配置管理器.

出现 配置管理器 对话框.

Platform 下,选择下拉菜单并点击 New.

会出现 New Project Platform 对话框.

设置 New Platform: x64Copy settings from: Win32.

点击 OK 关闭对话窗口.

点击 Win32 下拉菜单并选择 x64.

7.  解决方案资源管理 单击一下选择 addtwo 项目. 从 项目 菜单中选择 项目 添加存在项.

出现 添加存在项 对话框.

8.  使用文件选择器窗格浏览至下列目录:

32位 Windows

C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows\WSTPExamples

64位 Windows

C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows-x86-64\WSTPExamples

9.  文件名称: 文本框中输入 "addtwo.c" "addtwo.tm" (由空格分开). 点击 增加.

10.  能会出现提示框询问你是否要创建一个新规则建立 .tm 文件. 点击 .

11.  解决方案资源管理 中把 addtwo.tm 文件拖入到 源文件 文件夹.

12.  解决方案资源管理 单击一下选择 addtwo 项目. 从 项目 菜单中选择 项目 添加存在项.

出现 添加新项 对话框.

位置 文本框中敲入:

C:\Users\<username>\documents\visual studio 2010\Projects\addtwo

点击 C++ File (.cpp).

名字: 文本框中输入: addtwotm.c.

点击 增加.

关闭在文件编辑器窗格中打开的 addtwotm.c 文件编辑器.

13.  解决方案资源管理 中右击 addtwo 项目,选择 属性.

14.  点击 配置属性 旁的 扩展树 图标.

15.  点击 Linker 旁的 Expand Tree 按钮.

16.  点击 输入.

17.  附加依赖 文本框中输入 wstp32i4m.lib.

点击 OK.

对于 Windows 64 位,输入 wstp64i4m.lib.

18.  解决方案资源管理 中点击 addtwo.tm. 从 项目 菜单选择 项目 添加存在项.

出现 addtwo.tm 属性页面 对话框.

19.  点击 配置属性 旁的 扩展树 图标.

20.  点击 Custom Build Step 中的 Expand Tree 按钮.

21.  点击 General.

22.  命令行最右边的窗格中,单击空框,在该文本框中键入(包括引号):"$(VCInstallDir)\bin\wsprep.exe" "%(FullPath)" -o "$(ProjectDir)..\addtwotm.c".

64位 Windows

对于 Windows 64 位,使用: "$(VCInstallDir)\bin\amd64\wsprep.exe" "%(FullPath)" -o "$(ProjectDir)..\addtwotm.c".

23.  输出 文本框中键入:..\addtwotm.c.

点击 OK.

24.  解决方案资源管理 中右击 addtwo 项目,然后选择 属性.

25.  点击 配置属性 旁的 Expand Tree 图标.

26.  点击 General.

27.  点击 Project Defaults 扩展树按钮.

28.  设置下拉菜单为 Not Set,而不是 Character Set.

点击 OK.

29.  Build 菜单中选择 Build Build Solution.

30.  生成项目后,Microsoft Visual Studio 2010 会显示对话框通知你,文件 addtwotm.c 已变化,并问你是否想重载文件. 点击 Yes.

31.  现在 addtwo.exe 的二进制文件在:

32位 Windows

C:\users\<username>\documents\visual studio 2010\Projects\addtwo\addtwo\Debug

64位 Windows

C:\users\<username>\documents\visual studio 2010\Projects\addtwo\addtwo\x64\Debug

创建 factor.exe 项目
创建一个可用于编辑、构建和调试 "factor.exe" 的项目方案:

1.  启动 Microsoft Visual Studio 2010.

2.  点击 File New Project.

出现 New Project 对话框.

3.  Installed Templates 窗格中,点击 Visual C++ 旁的树扩展图标. 选择 Win32. 在 Templates 窗格中,点击 Win32 Console Application 图标.

4.  Location 文本框中输入:

C:\users\<username>\documents\visual studio 2010\Projects

Name 文本框,输入 factor.

点击 OK.

出现 Win32 Application Wizard 对话框.

5.  点击 Application Settings. 在 Additional options 设置中,点击 Empty Project 文本框.

6.  若要构建64位版本的 factor,点击 Win32 下拉菜单并选择 Configuration.

出现 Configuration Manager 对话框.

Platform 下,选择下拉菜单并点击 New.

会出现 New Project Platform 对话框.

设置 New Platform: 将下拉菜单设为 x64Copy settings from: 设为 Win32.

点击 OK 关闭对话窗口.

点击 Win32 下拉菜单并选择 x64.

7.  Solution Explorer 单击一下选择 factor 项目. 从 Project 菜单中选择 Project Add Existing Item.

出现 Add Existing Item 对话框.

8.  Look in 下拉菜单中选择如下目录:

32位 Windows

C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows\WSTPExamples

64位 Windows

C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows\WSTPExamples\Debug

9.  File name: 文本框中输入: factor.c.

点击 Add.

10.  右击 Solution Explorer 中的 factor 项目,然后选择 Properties.

11.  点击 Configuration Properties 旁的 Expand Tree 图标.

12.  点击 Linker 旁的 Expand Tree 图标.

13.  点击 Input.

14.  Additional Dependencies 文本框中输入 wstp32i4m.lib.

点击 OK.

15.  Build 菜单中选择 Build Build Solution.

16.  现在 factor.exe 二进制文件在:

32位 Windows

C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows\WSTPExamples\Debug

64位 Windows

C:\Program Files\Wolfram Research\Mathematica\11.0\SystemFiles\Links\WSTP\DeveloperKit\Windows-x86-64\WSTPExamples\Debug

运行 WSTP 程序
构建 WSTP 程序中介绍了如何使用 WSTPExamples 目录中的源代码构建两个 WSTP 程序. 这两个程序:addtwo.exe 和 factor.exe 已经在 PrebuiltExamples 文件夹中为你建好了. 在你自己建立它们之前,你应该试着运行这些预建例子去验证 WSTP 系统补充部分是否已安装,并且了解当例子正确编译时会有什么样的结果.
在尝试了这两个例子后,你应该阅读下面的小节,了解在 Windows 计算机上运行 WSTP 程序你将面临的其它问题.
addtwofactor 程序概括了两种基本类型的 WSTP 程序. 第一个是可安装程序,一个可安装程序向内核提供新的功能,通过调用机制,链接 C 程序和内核. 为了获得这一新功能,Wolfram 语言的用户必须运行 Install[] 函数. 在 addtwo 例子中,你可以加入新的函数 AddTwo[],用来对两个数求和(这两个数是作为参数输入的). 内核和可安装程序有着特殊的关系,允许它们之间互相通讯. 当可安装程序运行时,它需要你提供一些信息以便连接. 另一种类型的程序是前端. 前端力图创建和管理自己的链接. 除了 factor 例子,Wolfram 系统前端和 Wolfram 语言内核也是前端类型的典型例子. 前端不需要任何额外的信息就能够运行,但通常会在执行过程中的某一时刻进行连接.

在 Wolfram 语言内核中运行预建例子

第一个例子程序,addtwo 是一个安装在 Wolfram 系统的 WSTP 模板程序. 也就是说,这个程序在后台运行,作为 Wolfram 语言的一项服务,提供一个或多个外部编译功能. 对于 Wolfram 语言用户,这些功能是内置的. addtwo 程序使用模板文件定义了 Wolfram 语言函数 AddTwo[] 来调用 C 函数 addtwo(). (在设置从 Wolfram 系统中调用的外部函数中描述了该模板机制.) 该程序的源代码如下所示:
执行以下两个单元:
执行下列单元,查看最新可用函数:
以下显示了在 "addtwo.tm" 文件中定义的 AddTwo[] 函数的使用信息:
试一试:
看看如果两个机器整数的和不匹配于一个机器的整数或如果任意一个参数都不是机器整数,会出现什么情况. (2^31-1 是最大的机器整数. 如果你的编译器使用2个字节整数,那么 2^15-1 是最大的 C int.)
AddTwo 程序不适于大的整数:
以下不匹配 AddTwo[_Integer, _Integer]
Install[] 调用 LinkOpen[],然后和外部程序交换信息,设置 AddTwo[] 的定义. 你无需考虑这些细节,但是如果你很好奇,可执行以下命令:
当你不再使用外部程序,执行如下命令:

从一个预建的范例中调用 Wolfram 语言内核

第二个范例,factor 是运行在后台的 Wolfram 语言内核为 factor 提供服务,内核的计算服务,Wolfram 系统的前端对用户的输入整数给出因式分解.
这个例子程序象其它几个一样,是一个控制台程序. 也就是说,它不提供一个图形用户界面,而是在一个控制台窗口与用户交互,使用由 ANSI C 定义的标准的错误、输入和输出流. (在与 WSTP 的实践中,你会发现使用控制台窗口很方便和原始. 详细讨论请见 构建 WSTP 程序.)
运行例子程序 factor.exe:

1.  启动命令提示符窗口.

2.  切换到 "PrebuiltExamples" 目录.

3.  输入以下命令.

出现 选择 WSTP 程序 对话框.

4.  打开 MathKernel.exe.

片刻后,会出现一个提示,要求你输入一个整数.

5.  键入一个少于10个数字的整数,然后按 Enter. (其他 factor 例子会放宽对输入的整数大小的限制.)

会输出由 Wolfram 语言返回的素因子,并且 "factor" 关闭和 Wolfram 语言的链接.

支持的链接协议

WSTP 链接由 C 函数 WSOpenArgcArgv() 和 Wolfram 语言函数 LinkCreateLinkLaunchLinkConnect 打开,每个接受一个指定的链接协议选项. 在 32 位 Windows 平台,LinkProtocol 选项的合法值是 "SharedMemory""TCPIP""FileMap""TCP""IntraProcess". 在 Windows 64 位平台 LinkProtocol 选项的合法值是 "SharedMemory""TCPIP""TCP""IntraProcess". 链接协议是用于传输数据的. 除了 LoopBack,所有链接模式的默认值是 "SharedMemory".
请注意,"FileMap""SharedMemory" 协议允许链接名称必须是31个或更少的任意字符,"TCPIP""TCP" 协议链接名称通常是16位无符号整数. 虽然 "TCPIP""TCP" 链接名称是整数,但仍然以(数字组成的)字符串形式赋给 WSOpenArgcArgv()LinkOpen[].
请注意,对于 LinkMode->Launch,该链接名称不只是一个要启动的文件路径,而且是一个有空格分隔的参数的命令行. 因此,文件名中的空格需要适当地使用引号. 例如,
会启动带有Prog.exe的命令行参数的My程序. 而
会启动 My Prog.exe.
疑难解答