从Chapel调用外部模块

时间:2017-10-04 19:40:49

标签: makefile chapel

我正在尝试在另一个程序中使用我的NumSuch模块。我的Makefile包含

NUMSUCH_HOME=/home/buddha314/numsuch/src
MODULES=-M$(NUMSUCH_HOME)

yummly: yummlyAnalysis.chpl
    $(CC) $(FLAGS) $(MODULES) -o yummlyAnalysis $<
    #$(CC) $(MODULES) -o yummlyAnalysis $<

在代码中,我不想use NumSuch,因为我不想污染名称空间。我以为我可以

var g = NumSuch.buildFromSparseMatrix(A, weighted=false, directed=false);

但在编译期间,我得到了

yummlyAnalysis.chpl:72: error: 'NumSuch' undeclared (first use this function)
Makefile:12: recipe for target 'yummly' failed

1 个答案:

答案 0 :(得分:3)

这个程序的问题是Chapel不知道NumSuch是模块的名称而不是记录,类或拼写错误。因此,它不会在您的模块搜索路径中查找它。修复是让Chapel知道有一个名为NumSuch的模块:

执行此操作的一种方法是通过use语句(这声明存在具有给定名称的模块,并且如果尚未找到它,将导致编译器继续寻找它)。您可以通过使用过滤器来避免命名空间污染,这些过滤器不会导致在use语句范围内看不到符号:

use NumSuch only ;     // only make this (empty) list of symbols available

或:

use NumSuch except *;  // make all symbols available except for `*` (all of them)

在其中任何一个陈述之后,您的电话应该有效:

NumSuch.buildFromSparseMatrix(...);

并且不应该进行无限制的通话,因为use没有符号可用:

buildFromSparseMatrix(...);

您甚至可以将use语句放入其他范围,这会导致编译器寻找模块,找到它,知道有一个具有该名称的模块,并将命名空间污染限制在该范围内(虽然我认为这与之前的,更惯用的方法相比在风格上更差):

{
  use NumSuch;  // causes the compiler to go looking for module NumSuch; limits namespace pollution to this scope...
}
NumSuch.buildFromSparseMatrix(...);

执行此操作的第二种方法是在NumSuch.chpl命令行上明确列出chpl源文件。默认情况下,将解析命令行上命名的所有源文件,并使编译器知道其模块。