多个链接的GPRBuild项目中的相同基本软件包

时间:2018-11-02 18:45:43

标签: ada gnat gprbuild

使用GPRBuild,我创建了一个名为Lib的图书馆项目。 Lib中的所有软件包都位于软件包Base中,我将其用作基本软件包:具有基本软件包Base。例如,如果我要在我制作的任何库或应用程序中创建软件包Apple,它将被写为package Base.Apple

与此有关的问题,使用GPRBuild。为了将事物放置在Base包下,它必须存在。因此,在GPRBuild库项目Lib中,我有一个文件base.ads,它表示软件包Base的存在。然后在我正在使用库Lib的项目中,我们将其称为Proj,我还将所有包都放在Base包下({{1}内的包}。为此,我们也需要为Proj创建一个base.ads文件,并为此包定义Proj

我们来看看Base项目文件:

gpr

由此产生了问题;我们突然有两个文件,都称为with "lib.gpr"; project Proj is -- ... end Proj; ,都定义了base.ads包,每个项目中都有一个文件:库项目Base和使用库{的项目Lib {1}}。由于我们有两个名称相同的软件包(及其文件),因此在编译时会收到此错误,这一点也不奇怪:

  

Proj

问题是:有没有办法在多个项目中拥有相同的基本软件包?然后通过导入(Lib)链接在一起的项目。如果应该证明它是可能的,那么如何实现呢?

1 个答案:

答案 0 :(得分:6)

您需要将base/软件包放入自己的项目中。以下是最小演示。

project Base is end Base; package Base is end Base; 中,

lib/

with "../base/base.gpr"; project Lib is end Lib; package Base.Lib is end Base.Lib; 中,

proj/

with "../lib/lib.gpr"; project Proj is end Proj; with Base.Lib; package Base.Proj is end Base.Proj; 中,

$ cd proj/
$ gprbuild
using project file proj.gpr
Compile
   [Ada]          base.ads
   [Ada]          base-lib.ads
   [Ada]          base-proj.ads

然后

try {

$map = new MongoCode(

    'function(){ 
        var re = new RegExp(/(.+)\.([a-zA-Z]{2,})$/);
        doctype = this.value.match(re);
        if(parseFloat(this.completed)>0.5){
            emit(doctype[2], parseFloat(this.completed));
        }
    }'

);

$reduce = new MongoCode(

    'function(key, values){ 
        var sum = 0, num = 0;
        for(var i in values){
            if(parseFloat(values[i])>0.5){
                sum += values[i];
                num += 1;
            }
        }
        return { number_of_documents :         num, 
                 sum_of_document_completions : sum, 
                 average_completion :          (sum/num) }; 
    }'

);

$query = array (
        "folder"    => "work"
);

$doctypes = $db->command( 
        array(
            'mapReduce'     => 'mydocuments',
            "map"           => $map,
            "reduce"        => $reduce,
            "query"         => $query,
            "out"           => array("inline"=>1)
        )
);

print_r ( $doctypes);

}
catch(MongoCursorException $e) {
     echo "error message: ".$e->getMessage()."\n";
     echo "error code: ".$e->getCode()."\n";
}