【问题标题】:Building static stand alone library with gprbuild使用 gprbuild 构建静态独立库
【发布时间】:2017-02-24 01:07:32
【问题描述】:

我正在尝试使用 gprbuild 构建一个静态库。该库没有主库(用 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 时,我在日志中看到不包含对 binder 的调用:

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 没有导出adainitadafinal。我尝试链接它并使用objdump 进行了验证。

我尝试了各种开关组合但没有任何东西可以调用活页夹,除非我将Library_Kind更改为dynamic并使用Library_Standalone

【问题讨论】:

  • 是否可以添加一个存根“main”来强制链接adainitadafinal,但永远不要调用它?

标签: gcc ada gnat


【解决方案1】:

如果您的库不需要是静态的,而只是自包含(即在其自身中包含 Ada 运行时的必要部分),您可以说

for Library_Kind use "dynamic";
for Library_Interface use ("One_Of_Your_Units");
for Library_Standalone use "encapsulated";

(你必须有一个Library_Interface,但我认为它不必包括所有导出 C 可见符号的单元)。

不幸的是,正如您所说,这不适用于静态库。

【讨论】:

    猜你喜欢
    • 2017-11-23
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多