虚拟全书 > 系统界面与部署 > MathLink 和外部程序的通讯 > MathLink 程序的可移植性 >

MathLink 程序的可移植性

Mathematica 这一方面与 MathLink 的关联对所有的计算机系统完全一样. 但在不同计算机系统中的外部程序之间肯定有所不同.
首先,不同计算机系统几乎总是需要不同的可执行二进制代码. 于是,在调用 Install 时,必须确认 prog 与一个能在所用的计算机系统上执行的程序相对应.
Install["file"]直接执行一个文件 file
Install["file",LinkProtocol->"type"]使用低层数据传输的特殊协议
$SystemID将所用计算机系统看作同一类型
Install["dir"]执行名为 dir/$SystemID/dir 的一个文件

在不同的计算机系统中安装程序.

Mathematica 约定当 prog 是一个通常文件时,Install 就试图执行它. 而当 prog 是一个目录时,Mathematica 将寻找它之中名称与 $SystemID 一致的一个子目录,然后试执行该子目录中名为 prog 的文件.
mcc -o prog ... 将编译后的代码放在当前目录中的文件 prog
mcc -xo prog ... 将编译后的代码放在 prog/$SystemID/prog

编译外部程序的典型 Unix 命令.

即使可执行的外部程序的二进制在不同的计算机系统中肯定不同,但在从 C 语言等中得到该二进制代码的源代码基本上相同.
为了使源代码具有可移植性,要注意下面几点:
首先,不要使用为特殊系统提供的 C 语言或 C 运行库而不是标准 C 中的功能. 另外,也不要使用段或其它特殊内存模式.
包含文件 mathlink.h 含有 MathLink 库中所有函数的标准 C 原型.
MLPutInteger32()MLGetInteger32()对应于 C 类型 的整数,即 32 位
MLPutInteger16()MLGetInteger16()类型 的整数,即 16 位
MLPutInteger64()MLGetInteger64()64 位整数
MLPutReall64()MLGetReal64()IEEE 双精度浮点数,对应于 C 语言类型
MLPutReal32()MLGetReal32()IEEE 单精度浮点数,对应于 C 语言类型
MLPutReal128()MLGetReal128()IEEE 四精度浮点数

使用特殊 C 类型的 MathLink 函数.

在便携式地调用 MathLink 库函数时,必须使用与函数中相同的类型.
将数据传递给 MathLink 库函数后,这些函数就负责处理与不同计算机系统中这些数据表示法差异有关的问题. 例如,在不同大小的机器之间传递数据时,MathLink 就自动淹没一些字节,转换浮点格式,尽可能地保持精度.
MLPutString(stdlink,char*s)放一个以 null 结尾的C字符串
MLPutUnicodeString(stdlink,unsigned short*s,int n)
放一个用16位UCS-2 Unicode字符编码的字符串
MLPutByteString(stdlink,unsigned char*s,int n)
放一个仅含有8位字符代码的字符串
MLPutUTF8String(stdlink, const unsigned char*s,int n)放一个用 UTF-8 的 Unicode 字符编码的字符串
MLPutUTF16String(stdlink, const unsigned short*s,int n)放一个用 UTF-16 的 Unicode 字符编码的字符串
MLPutUTF32String(stdlink, const unsigned int*s,int n)放一个用 UTF-32 的 Unicode 字符编码的字符串
MLGetString(stdlink,char**s)得到一个以 null 结尾的 C 字符串
MLGetUnicodeString(stdlink,unsigned short**s,long*n)
得到用 16 位 UCS-2 Unicode 字符编码的字符串
MLGetByteString(stdlink,unsigned char**s,long*n,long spec)
得到仅含有 8 位字符代码的字符串,使用 spec 作为所有16位字符的代码
MLGetUTF8String(stdlink, const unsigned char**s,int*m,int*n)得到用 UTF-8 的 Unicode 字符编码的字符串
MLGetUTF16String(stdlink, const unsigned short**s,int*m,int*n)得到用 UTF-16 的 Unicode 字符编码的字符串
MLGetUTF32String(stdlink, const unsigned int**s,int*n)得到用 UTF-32 的 Unicode 字符编码的字符串

一般字符串的操作.

在简单的 C 程序中,一般使用仅含有常规 ASCII 字符的字符串. 但在 Mathematica 中可以使用含有各类特殊字符的字符串. 这些字符在 Mathematica 中用 Unicode 字符代码给出,如 "字符的原始代码" 中讨论的.
C 语言中 字符串一般仅用8位去保存每个字符的代码. 而 UCS-2 编码字符串却需要 16 位. 所有,函数 MLPutUnicodeString()MLGetUnicodeString() 用无符号的短整数 数组工作. 对于 UTF-16 编码字符串和对应的函数 MLPutUTF16String() 和 MLGetUTF16String()也同样适用.
UTF-32 编码字符串对每个字符需要32位,并且对应的函数 MLPutUTF32String()MLGetUTF32String() 适用于无符号整数 unsigned int 的数组.
当知道所用程序不涉及特殊字符时,用 MLPutByteString()MLGetByteString()是方便的.这些函数直接用8位字符代码表示所有字符. 如果从 Mathematica 发送一个特殊字符时,就用 MLGetByteString() 将它转换成所给出的固定代码.
可能会随计算机系统的不同而不同

产生便携式 MathLink 程序的一个注意点.

计算机系统和具有基于 Unix 模式的 C 运行库的编译器允许 MathLink 程序有一个主程序,其形式为,它简单地调用 MLMain.
有些计算机系统或编译器则需要不同形式的主程序. 要知道调用 MLMain()之前在 内可以任意进行各种初始化. 但调用了 MLMain()之后,程序就进入了无限循环,直到链接关闭之前它与来自 Mathematica 的需求相呼应.
Ask a question about this page  |  Suggest an improvement  |  Leave a message for the team
格式:   HTML  |  CDF