gnat gprbuild:如何使用静态c ++库构建动态dll和链接

时间:2014-08-04 11:29:53

标签: c++ dll static-libraries ada

我有一个完整的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 \”目录中,但它仍然没有链接:“未定义引用...”

有人可以帮我吗?

此致 格伦

2 个答案:

答案 0 :(得分:2)

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

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

(我很困惑 - 您的意思是myanotherlibrary.lib还是bar.lib?)

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

答案 1 :(得分:0)

这是我最终找到的解决方案。

  1. 无法链接使用MSVC编译的静态库。我不得不用GCC编译我的静态库(与GNAT中包含的版本相同)。
  2. 我不得不添加“Library_Options”选项,没有“-L”和“-l”参数(我传递的另一个问题)。请注意,构建动态库时不会考虑包链接器。另请注意,路径不应有空格!
  3. project My_grp_project is
    
      for Languages use ("Ada");
      for Source_Dirs use (".", "source", "source\common");
      for Library_Dir use “dll";
      for Library_Ali_Dir use "ali";
      for Object_Dir use "obj";
    
      for Library_Name use "My_grp_project";
      for Library_Kind use "dynamic";
      for Library_Options use ("path\myanotherlibrary.a", "path_to_GNAT\libstdc++.a");
    
    end My_grp_project;
    
    1. 我在GPS中构建了项目(默认选项):“Build All”
    2. 结果我的动态库“libMy_grp_project.dll”
    3. 瞧。 谢谢!