使用GPRBuild,我创建了一个名为的库项目Lib
.所有包都Lib
驻留在包中Base
,我将其用作基本包:具有基本包Base
.例如,如果我要Apple
在我创建的任何库或应用程序中创建包,它将被写为package Base.Apple
.
这个问题,使用GPRBuild.为了把东西放在Base
包装下面,它需要存在.Lib
因此,在GPRBuild库项目中,我有一个base.ads
表示包存在的文件Base
.然后在我正在使用该库的项目中Lib
,让我们将其称为Proj
,我也将所有包放在Base
包(包内Proj
)中.为了做到这一点,我们需要使用包定义来创建一个base.ads
文件.Proj
Base
我们来看看gpr
项目文件:
with "lib.gpr";
project Proj is
-- ...
end Proj;
Run Code Online (Sandbox Code Playgroud)
通过这个出现了问题; 我们突然有两个文件,都叫做base.ads
,都定义了Base
包,每个项目一个:库项目Lib
,以及Proj
使用库的项目Lib
.由于我们有两个包(和它们的文件)命名相同的东西,我们得到这个错误,这在编译时完全不奇怪:
unit "base" cannot belong to several projects
问题是:有没有办法在多个项目中拥有相同的基础包?然后通过import(with
)链接在一起的项目.如果它应该被证明是可能的,它怎么能实现呢?
我有一个项目,我经常在其中的某个目录中创建许多新的主入口点 *.adb 文件。有什么方法可以使用 gprbuild 设置我的项目,以便添加新的主程序不需要编辑 .gpr 项目文件?
目前,我有这个,每次添加新电源时都需要修改电源列表:
project Adabots is
for Source_Dirs use ("src", "src/examples");
for Main use ("build_wall.adb", "remove_wall.adb", "get_stone.adb", "staircase_down.adb", "josephine.adb", "dig_cavern.adb", "build_maze.adb", "elevator.adb", "lovelace.adb", "dig_hallway.adb", "spiral_staircase.adb", "walk_up_stairs.adb");
Run Code Online (Sandbox Code Playgroud)
但是我想要做的只是说里面的每个 .adb 文件src/examples
都应该被视为主文件。
我升级到了GNAT社区2018(GNAT GPL 2017一切正常。)我有这个项目文件:
with "opengl";
library project OpenGL.Soil is
for Library_Name use "SoilAda";
for Languages use ("ada", "c");
for Source_Dirs use ("src/soil");
-- snip compiler config
end OpenGL.Soil;
Run Code Online (Sandbox Code Playgroud)
现在src/soil
,中有两个.ads
和.adb
文件以及.h
和.c
文件。以前,该项目文件编译了所有文件,并将它们链接在一起就可以了。从GNAT Community 2018开始,此文件仅编译Ada源,而不编译C源。
我尝试过的事情:
Naming
程序包设置,Spec_Suffix
并Implementation_Suffix
为C指定了相应的文件结尾。Source_Files
并将所有Ada和C文件放入其中。无论我做什么,GPRBuild在调用时都不会编译C文件(导致链接器错误)。即使明确指定了C文件,也没有错误或警告输出。
如何使GPRBuild再次编译C文件?
这些信息可以在其他地方找到,但没有合并到这个特定的用例中,因此我觉得需要一个我(和其他人)可以参考的 stackoverflow 自我回答。如果我遗漏了什么,请随时添加您自己的答案。
project some_project is
for Source_Dirs use ("src");
for Object_Dir use "obj";
for Main use ("main.adb");
package Compiler is
for Default_Switches ("ada") use ("-O1", "-gnatwae");
end Compiler;
end some_project;
Run Code Online (Sandbox Code Playgroud)
我想让这个生成../some_program_name.exe
. 如何指定该 gpr 项目将生成的可执行文件的名称?可以在上面的目录中吗?
我有一个 gpr 项目,它使用 gnatprep 来预处理源文件。但现在我有一个工具需要已经预处理的源文件。我知道我可以找到每个源文件并通过 gnatprep 运行它:
find . -type f -iname '*.ad[sb]' -exec gnatprep -DSymbol=value {} {}.prep \;
Run Code Online (Sandbox Code Playgroud)
但我想利用项目文件来找到正确的源文件并传递它们。我的项目文件还定义了要使用的各种符号值,我必须将其添加到上面的命令中。是否可以通过 .gpr 文件中的某些参数?例如
for Object_Dir use 'obj';
for Preprocessed_Sources_Dir use 'wow_that_was_easy';
Run Code Online (Sandbox Code Playgroud) 我正在尝试从 Linux ( Fedora 29 )交叉编译一个以 Windows 为目标的 Ada 程序。我对编译一无所知,Gnat 项目经理文档无法帮助我这个菜鸟。我更喜欢在项目文件中使用开关,并使命令尽可能简单。我该怎么办?
我试过gprbuild -P logfilter.gpr --target=Windows
导致
Error: no compiler found for language 'c', target = Windows, default runtime
Error: no compiler found for language 'ada', target = Windows, default runtime
logfilter.gpr:3:09: warning: no compiler specified for language "Ada", ignoring all its sources
logfilter.gpr:7:19: "log_filter_main.adb" is not a source of project "logfilter"
gprbuild: problems with main sources
Run Code Online (Sandbox Code Playgroud)
这是我的gprconfig
:
prconfig has found the following compilers on your …
Run Code Online (Sandbox Code Playgroud) 我有一个带有多个构建配置的 Gnat/Gprbuild 项目。我有一个主源文件和一个辅助广告文件,其中主源文件包括:
with Secondary_File; use Secondary_File;
Run Code Online (Sandbox Code Playgroud)
问题是在每个配置中,辅助文件都有不同的名称。例如,一个配置的名称可能为Secondary_File_1.ads,另一配置的名称可能为Secondary_File_2.ads。这使得上面的with
语句无法使用。
在C中,我会做这样的事情:
#ifdef BUILD_CFG_1
#include "secondary_file_1.h"
#else
#include "secondary_file_2.h"
#endif
Run Code Online (Sandbox Code Playgroud)
是否有一种聪明的方法可以使用 Gprbuild 系统在 ADA 中执行此类操作?
我有一个基于 GPR 的大型项目,编译可能需要 30 多分钟。
在分析了构建过程后,我注意到许多明显的低效率(多次调用 gprbuild 而不是聚合、过度使用替代文件而不是配置等)。我想知道是否有一些方法可以“分析”构建过程以查看需要这么长时间。
特别是即使是单个文件发生变化并且出现错误时,重新编译也需要大约5分钟。从理论上讲,应该很快意识到必须重新编译该文件(这是唯一一个这样做的)并开始编译过程,迅速发现错误。
从详细的输出来看,解析用于定义构建的大量 gpr 文件网络似乎需要相当长的时间,但我想知道它大部分时间都花在了哪里。
因此我的问题是:是否可以分析由 gprbuild 完成的构建?如果是这样,如何?
使用GtkAda,我尝试使用资源API在代码中直接包含Glade文件。
为此,我们可以使用glib-compile-resources从一组资源中生成C代码,然后可以将其链接到Ada代码。
问题在于,此C代码需要Gtk包含,我们通常从Linux下的pkg-config命令获得该包含,例如
gcc -c -x c `pkg-config --cflags gio-2.0` myglade.gresource.c
Run Code Online (Sandbox Code Playgroud)
我想知道如何在GPRBuild项目文件中提供相同类型的信息。
仅供参考,我已经尝试在C语言的编译器软件包中使用pkg-config命令,但没有成功。当然,我设法手工建造,但这有点长:)
我有一个项目,其中包含几个具有相同名称但在不同文件夹中的文件.
例如:
->sources
->src
- a.c
- b.c
->stub
- a.c
- z.c
Run Code Online (Sandbox Code Playgroud)
在我的gprfile中,我包含了源代码
for Source_Dirs use ( "sources/**" )
Run Code Online (Sandbox Code Playgroud)
现在,我想通过使用原语"Excluded_Source_File"来忽略src中的文件.
不幸的是,这个原语需要一个文件名,而不是一个完整的路径,所以当我想忽略ac时,它会忽略src和stub中的两个文件.
for Excluded_Source_Files use ( "sources/src/a.c" ); -- KO by gprbuild
for Excluded_Source_Files use ( "a.c" ); -- OK but ignore both
Run Code Online (Sandbox Code Playgroud)
有没有人知道我怎么能这样做,而不改变当前的文件夹架构和没有重命名文件?