NAG C 头文件常见问题
目录
| Q1. | 在 Unix 环境中,当我要链接程序时,为何会出现 "unresolved external references" 的错误? |
| Q2. | 当我调用 NAG 函数时,若输入的是多维矩阵时,为什么会得到错误的结果? |
| Q3. | 我可以从 C++ 中使用 C 的 Header Files 吗? |
| Q4. | 如果要从 C 语言中调用 NAG Fortran 算法库,我需要 Fortran 编译器吗? |
Q1. 在 Unix 环境中,当我要链接程序时,为何会出现 "unresolved external references" 的错误?
NAG Fortran 算法库必须要与 Fortran run time 档案链接。最简单的方式就是使用 f77 指令来链接先前编译好的 C 程序。透过这样的方式, f77 编译器便会链接 Fortran run time 档案,例如:
cc -c myprog.c f77 -o myprog myprog.o -lnag
在我们的 C 头文件的技术文章中,我们便是建议以这样的方式实现。 你需要将 Fortrna run time 算法库链接进来。如果你明白这个道理,也可以使用 cc 或 ld 命令进行链接。实际上,在某些特殊情形下,也许需要透过 cc 或者 ld 命令来进行。
为了要了解 Fortran run time 算法库是以什么 f77 的命令链接起来,可以透过 f77 的参数来显示编译器所产生的指令。 这些参数可能是 -dryrun、-v 或者是 -V。您可以参考 f77 的说明文件。 你也可以编写一个空的程序,例如只加入一个简单的 end 语句,并指定这是 f77 的程序;观察 ld 的命令并尝试找出必要的 -L 与 -l 的命令来链接程序库。 利用相同的方法,可以透过一个简单的 C 程序了解 cc 编译器的相关数据。
使用 cc 命令去链接 Fortran 程序:-L 与 -l 参数是 f77 的 ld 命令,必须要指定 cc 的 ld 命令。
使用 ld 命令去链接 Fortran 程序:-L 与 -l 参数是 f77 的 ld 命令,cc 的 ld 命令必须结合在一起。
不论采用哪个方式,可能都必须要实验以确保正确的顺序。
除非绝对必要,否则使用 f77 去链接程序会是比较简单的做法!
Q2. 当我调用 NAG 函数时,若输入的是多维矩阵时,为什么会得到错误的结果?
这个问题普遍是因为在 Fortran 与 C 语言中,多维的矩阵是以不同的方式储存。
Fortran 储存多维矩阵是以列主序 (Column major order) 方式,而 C 是以行主序 (Row major order) 方式,所以有两个方式解决:
- C 程序必须要储存与处理转换过的矩阵,或者
- C 程序必须要转换矩阵然后再调用 Fortran 函数。
Q3. 我可以从 C++ 中使用 C 的头文件吗?
是的。您可以透过 C++ 使用 NAG 的 C 头文件。这些档案中在一开头已经写好以下的资讯:
#ifdef __cplusplus
extern "C" {
#endif
以及相对应的右括号 "}":
#ifdef __cplusplus } #endif
这已经宣告所有的 Fortran 函数为 C 的函数,且不受继承的限制。
Q4. 如果要从 C 语言中调用 NAG Fortran 算法库,我需要 Fortran 编译器吗?
NAG Fortran 算法库使用 Fortran 语言的内在函数与 I/O 函数,因此您需要合适的 Fortran run time 档案。在大多数的平台上,仅仅由 Fortran 编译器提供。所以您需要合适的 Fortran 编译器。