【问题标题】:Ada static compilationada静态编译
【发布时间】:2021-01-13 05:54:17
【问题描述】:

我编译了一个simple Ada application,它使用Win32Ada 库。

我正在 Windows 上编译应用程序:

gnatmake C:\GNAT\2020\bin\src\main.adb -I"C:\GNAT\2020\lib\win32ada" -largs -lwin32ada.

应用程序在编译机上按预期工作,并且在执行 main.exe 时会执行 MessageBox

但是,当尝试在另一个没有安装 Ada 库的 Windows 系统上执行应用程序时,我收到了一个错误:

Ada 是否支持静态编译?

我是否可以编译应用程序,以便 main.exe 可以在任何 Windows 主机上执行,而无需捆绑 DLL 的?

我在gnatmake --help 中找不到答案(但我也是Ada 的新手)。

【问题讨论】:

  • 为什么不在第二台机器上安装库?静态链接 Windows GUI 程序可能会产生相当大的可执行文件。
  • 我想与 Windows API 交互,不一定要创建 GUI。 MessageBox 只是一个与 API 交互的 PoC。

标签: windows compilation static ada gnat


【解决方案1】:

默认链接模式在 Windows 上是静态的。因此,通常情况下,您不需要添加任何选项。如果需要强制使用,请使用-bargs -static gnatmake binder 选项或添加

 package Binder is
    for Default_Switches ("ada") use ("-static");
 end Binder;

到您的 .gpr 项目文件。

【讨论】:

  • 我强制使用 -bargs -static 选项,但是在另一台主机上执行时,我仍然看到缺少 DLL 的相同错误。
  • 此版本的 win32ada 库中的某些配置似乎需要 DLL。
  • 旁注:如果您想编写用户界面,正如您的消息框示例所暗示的那样,您可以使用独立且无 DLL 的 GWindows(请参阅 sourceforge.net/projects/gnavigithub.com/zertovitch/gwindows
  • 我正在 Ubuntu 上尝试这个,这只会产生一个动态链接的应用程序。这将如何在 Linux 上运行?
  • 在两个 gpr 包上尝试-static:Linker Binder。
【解决方案2】:

Ada 支持静态编译吗?

是的,这是默认模式。

我可以编译应用程序以便 main.exe 可以在任何 Windows 主机上执行而无需捆绑 DLL 吗?

你应该可以,但是我没怎么用过win32ada库;如果你不能做像 Deplhi 这样的事情,我会感到惊讶,其中可执行文件“直接”与 Win32 API 接口,尽管是 VCL 的抽象。

我认为您要标记的项目在链接器中,而不是活页夹中。 (尽管您可能需要两者。)检查 GNAT 参数细节的最佳位置是 the documentation,因为有大量参数在命名或使用方面基本上不直观。

--unchecked-shared-lib-imports 可能感兴趣;检查 win32ada 项目文件(尤其是任何场景变量)可能使您能够将其切换到静态库。在最坏的情况下,如果您将For library_kind use "static"; 添加到 Win32Ada 库中,您应该可以自己静态构建它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2017-03-01
    • 2011-01-28
    • 2012-05-24
    • 1970-01-01
    相关资源
    最近更新 更多