我正在尝试使用gprbuild构建一个静态库。这个库没有main (它是用C编写的,在后面的阶段链接),并且必须是自包含的,因为我理解gpr术语是“独立的”,这意味着在它的运行时期间,它将不需要与包括运行时在内的任何东西链接。
我的gpr是这样的
project Ada_Foo_Lib is
for Source_Dirs use ("src");
for Object_Dir use "obj";
for Library_Dir use "lib";
for Library_Name use "ada_foo_lib";
for Library_Kind use "static";
package Binder is
for Default_Switches("Ada") use ("-n");
for Required_Switches ("Ada") use ("-n");
end Binder;
end Ada_Foo_Lib;当我运行gprbuild时,我在日志中看到没有包含对绑定器的调用:
gnatmake -Pada_foo_lib.gpr --create-missing-dirs
gcc-4.9 -c -I- -gnatA /home/temp/src/ada_foo_pack.adb
building static library for project ada_foo_lib
ar cr /home/temp/lib/libada_foo_lib.a /home/temp/obj/ada_foo_pack.o
ranlib /home/temp/lib/libada_foo_lib.a我的问题是,生成的libada_foo_lib.a没有导出adainit和adafinal。我试图链接它,也用objdump验证了它。
我尝试了所有类型的开关组合,但都没有调用绑定器,除非我将Library_Kind更改为dynamic并使用Library_Standalone
发布于 2016-10-15 05:00:54
如果您的库不需要是静态的,而是自包含的(即在其内部包含Ada运行时的必要部分),您可以这样说
for Library_Kind use "dynamic";
for Library_Interface use ("One_Of_Your_Units");
for Library_Standalone use "encapsulated";(你必须有一个Library_Interface,但我不认为它必须包含导出C-可见符号的所有单元)。
不幸的是,正如您所提到的,这不适用于静态库。
https://stackoverflow.com/questions/40045891
复制相似问题