为什么coqide中的“make”和“using”CoqProject与命令行中的“coqc”不同?

为什么coqide中的“make”和“using”CoqProject与命令行中的“coqc”不同?,coq,coqide,Coq,Coqide,我有两个简短的文件:cc_测试由 引理cc:4=4。证明。自动的。Qed. libtest由 需要导入cc\u测试。检查抄送。 当我执行 coqc-R。ClosureLib-顶级ClosureLib cc_测试 在目录“/home/barry/svn/Coq/Closure\u calculation”中 及 coqc-R”/home/barry/svn/Coq/ClosureLib-libtest 在它的目录中,我得到了预期的输出 cc:4=4 但是,当上面coqc的参数(从-R到结尾)放在_

我有两个简短的文件:cc_测试由 引理cc:4=4。证明。自动的。Qed. libtest由
需要导入cc\u测试。检查抄送。

当我执行
coqc-R。ClosureLib-顶级ClosureLib cc_测试
在目录“/home/barry/svn/Coq/Closure\u calculation”中 及
coqc-R”/home/barry/svn/Coq/ClosureLib-libtest
在它的目录中,我得到了预期的输出
cc:4=4

但是,当上面coqc的参数(从-R到结尾)放在_CoqProject文件中时,我调用
makefile
,然后从coqide菜单调用
Make
,cc_测试可以,但libtest会产生输出
文件“/libtest.v”,第1行,15-22个字符:
错误:无法找到库cc_测试。

如何修改项目文件以使其正常工作

注释:coq参考手册(第15章)未提及这些方法之间的任何差异。此外,参数“-top ClosureLib”
在命令行方法中似乎是必要的,但使用
make
似乎无关紧要,因为在其他实验中,我经常收到错误消息,说它找到了Top.foo,但没有找到ClosureLib.foo。

首先,我不认为
-Top ClosureLib
在这里有用。将
-top
描述为

对于coqc无效,因为顶级模块名称是从 输出文件的名称

至于你的主要问题,我必须承认我的解决方案是使用

coq_makefile -f _CoqProject -o Makefile
make
make install
make install
将库放入
user contrib
中,在该位置将自动加载库。然后可以直接使用
Require

编辑:

多亏了@Zimm48,我明白了如何使用
$COQPATH
来完成相同的任务,而不必先安装依赖项。但是文件夹的名称将用作逻辑前缀,因此您必须在
-R
-Q
参数和目录名称中使用相同的标识符

我建议使用以下体系结构:

  • 在目录
    /home/barry/svn/Coq/ClosureLib
    (注意,我重命名了目录,使其名称与传递给
    -R
    的标识符相同),
    \u CoqProject
    包含

    -R . ClosureLib
    cc_test.v
    
    -R . MyLib
    libtest.v
    
    您可以编译cc_test.v,如下所示:

    coq_makefile -f _CoqProject -o Makefile
    make
    
    coq_makefile -f _CoqProject -o Makefile
    COQPATH=/home/barry/svn/Coq make
    
  • 在包含
    libtest.v
    的目录中,
    \u CoqProject
    包含

    -R . ClosureLib
    cc_test.v
    
    -R . MyLib
    libtest.v
    
    您可以编译
    libtest.v
    ,如下所示:

    coq_makefile -f _CoqProject -o Makefile
    make
    
    coq_makefile -f _CoqProject -o Makefile
    COQPATH=/home/barry/svn/Coq make
    

如果我读对了问题,这里没有“依赖性”,即两个文件都应该是同一个逻辑和物理目录的一部分。这在问题中并不清楚。用户指定了一个绝对路径这一事实让我假设有两个不同的文件夹,但我可能误解了这个问题。你试过Coq 8.7吗?CoqIDE Make功能用于不关心
\u CoqProject
文件。这是固定的。