【问题标题】:gnat gprbuild : how to build a dynamic dll and link with a static c++ librarygnat gprbuild:如何构建动态 dll 并与静态 c++ 库链接
【发布时间】:2014-09-26 20:47:18
【问题描述】:

我想要构建一个完整的 Ada 项目以获取动态 dll。 因此我必须将它与另一个静态库(myanotherlibrary.lib)链接。

我使用这个命令行:

gprbuild -d "D:\My_grp_project\My_grp_project.gpr"

这里是 .gpr 的内容:

project My_grp_project is

  Architecture := "x86";

  for Languages use ("Ada");
  for Source_Dirs use (".", "source", "source\common");
  for Library_Dir use "dll\" & Architecture;
  for Library_Ali_Dir use "ali\" & Architecture;
  for Library_Name use "My_grp_project";
  for Library_Kind use "dynamic";
  for Object_Dir use "obj\" & Architecture;

  package Linker is
   for Default_Switches ("Ada") use ("-L.", "-lbar");
  end Linker;

end My_grp_project;

我将“myanotherlibrary.lib”放在目录“D:\My_grp_project\”中,但还是没有链接:“undefined reference to ...”

谁能帮帮我?

问候 格伦

【问题讨论】:

  • 将 Ada 链接到 C++ 库...在 Ada 中,Import pragmas 必须提供每个对象(函数)名称的 C++ 错位版本,以便 Ada 代码找到它。见wiki.ada-dk.org/c_bindings_example这是你的问题吗?如果没有,请在示例中编辑实际的链接器错误消息。
  • 谢谢布赖恩。我确实得到了我的方法“Initialize”的 C++ 错误名称:“Initialize@MyObject_Interface@@SAXPBDAAW4T_MyObject_Status@@@Z (public: static void __cdecl MyObject_Interface::Initialize(enum T_MyObject_Status &))”。链接器仍然不想解析引用“对‘初始化’的未定义引用”。在我的 .ads 文件中,我写道:procedure initialize (Status : out T_MyObject_Status) is procedure C_Initialize (pStatus : out T_MyObject_Status);杂注导入(CPP,C_Initialize,“初始化”);开始 C_Initialize(pStatus => 状态);结束初始化;
  • 我认为这可能是问题所在:您需要pragma Import (CPP, C_Initialize, "c++_mangled_Initialize");,就像我链接到的示例一样。

标签: c++ dll static-libraries ada


【解决方案1】:

查看docs,我认为您应该使用Library_Options 属性而不是package Linker:

for Library_Options use ("-L.", "-lbar”);

(我很困惑 - 你是指 myanotherlibrary.lib 还是 bar.lib?)

我有点担心使用动态库中的静态库:我希望动态库使用-fPIC 或等效开关构建以获得与位置无关的代码,以便相同的加载库可以在每个使用它的可执行文件的不同地址看到二进制文件。

【讨论】:

  • 谢谢西蒙。我将我的 .gpr 文件更改为类似的内容:'project My_grp_project is''...与以前相同,没有包链接器...''fo​​r Library_Options use ("-Ld:\.", "-lmyanotherlibrary");' '结束 My_grp_project;'现在链接器确实在“d:\”上找到了我的“myanotherlibrary.lib”,但它仍然无法解析引用(请参阅我对 Brian 帖子的评论)
【解决方案2】:

我终于找到了解决办法。

  1. 无法链接使用 MSVC 编译的静态库。我必须使用 GCC 编译我的静态库(与 GNAT 中包含的版本相同)。
  2. 我必须添加“Library_Options”选项,没有“-L”和“-l”参数(我通过的另一个问题)。请注意,在构建动态库时不考虑包 Linker。另请注意,路径不得有空格!
项目 My_grp_project 是 用于语言(“Ada”); 对于 Source_Dirs 使用 (".", "source", "source\common"); 对于 Library_Dir 使用“dll”; 对于 Library_Ali_Dir 使用“ali”; 对于 Object_Dir 使用“obj”; 对于 Library_Name 使用“My_grp_project”; 对于 Library_Kind 使用“动态”; 对于 Library_Options 使用 ("path\myanotherlibrary.a", "path_to_GNAT\libstdc++.a"); 结束 My_grp_project;
  1. 我在 GPS 中构建了项目(默认选项):“Build All”
  2. 结果我确实有我的动态库“libMy_grp_project.dll”

瞧。 谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    相关资源
    最近更新 更多