我正在尝试在另一个程序中使用我的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
答案 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
源文件。默认情况下,将解析命令行上命名的所有源文件,并使编译器知道其模块。