ranlib 在 ASFML 中使用 Alire 和 GNAT 时出错

问题描述 投票:0回答:2

我正在学习如何通过 Ada 绑定到 SFML(即 ASFML)来使用 Alire。到目前为止我已经下载了 并使用 Alire 安装了 ASFML 并成功将其导入到我的测试项目中。当我去编译它时,它确实进行了编译和绑定,但卡在了链接器阶段。

这是错误:

gprbuild -d -PC:\Users\Amynu\testproj\testproj.gpr -XASFML_BUILD_MODE=optimize -XASFML_CONTRACTS=enabled -XASFML_STYLE_CHECKS=enabled -XASFML_RUNTIME_CHECKS=enabled -XASFML_COMPILE_CHECKS=enabled -XOS=Windows_NT -XTESTPROJ_BUILD_MODE=optimize -XTESTPROJ_CONTRACTS=disabled -XTESTPROJ_STYLE_CHECKS=disabled -XTESTPROJ_RUNTIME_CHECKS=disabled -XTESTPROJ_COMPILE_CHECKS=disabled
Compile
   [Ada]          testproj.adb
Bind
   [gprbind]      testproj.bexch
   [Ada]          testproj.ali
Link
   [link]         testproj.adb
c:/gnat/2021/bin/../libexec/gcc/x86_64-w64-mingw32/10.3.1/ld.exe: C:\Users\Amynu\testproj\alire\cache\dependencies\asfml_2.5.2_b775db19\lib\libasfml.a: error adding symbols: archive has no index; run ranlib to add one
collect2.exe: error: ld returned 1 exit status
gprbuild: link of testproj.adb failed

我完全不知道“ranlib”是什么,我搜索了 Alire,但它不是一个已知的板条箱或图书馆。我在 Alire 中尝试了各种选项,例如

alr with libranlib

alr get ranlib

无济于事。它是 GNAT 命令行中的一个选项吗?我确实查看了该项目的 GPR 文件,一切看起来都不错。当我使用

构建项目时,Alire 自动生成 GPR
alr init --bin testproj
alr cd testproj
alr with libasfml
alr build

我进行了 Google 搜索,发现了很多与 Unix 和 IBM 有关的解决方案(?)有关 ranlib 已经过时的问题,因为现在大多数编译器都使用“rm”?我找不到 GNAT 标记相同错误的解决方案。

我只是使用过时的音频库吗?

提前感谢您的帮助:)

ada alire
2个回答
0
投票

谢谢你们!这解决了问题。现在我陷入了一堆“未定义的引用......”我实际上浏览了所有源文件并通过 addIng Constant 删除了大多数变量名称的所有警告。我猜它正在寻找缺少的依赖项?

Build Libraries [gprlib] asfml.lexch [link library] libasfml.dll c:/gnat/2021/bin/../libexec/gcc/x86_64-w64-mingw32/10.3.1/ld.exe: C:\Users\Amynu\testproj\alire\cache\dependencies\asfml_2.5.2_b775db19\obj\sf-audio-music.o:sf-audio-music.adb:(.text+0x32): undefined reference to `sfMusic_createFromFile' 

下面大约 15 行具有相同的错误类型。查看之后,我查看了错误所引用的代码行,发现错误引用了看起来像外部文件的内容?它们是 ASFML 的一部分,没有随库一起下载吗?


0
投票

我搜索了代码中的第一个链接器错误并找到了它所引用的行。

with Interfaces.C.Strings;

package body Sf.Audio.Music is
   use Interfaces.C.Strings;

   --//////////////////////////////////////////////////////////
   --/ Create a new music and load it from a file
   --/
   --/ @param Filename   Path of the music file to open
   --/
   --/ @return A new sfMusic object (NULL if failed)
   --/
   --//////////////////////////////////////////////////////////
   function CreateFromFile (Filename : String) return sfMusic_Ptr is
      function Internal (Filename : chars_ptr) return sfMusic_Ptr;
      pragma Import (C, Internal, "sfMusic_createFromFile");
      Temp : chars_ptr   := New_String (Filename);
      R    : sfMusic_Ptr := Internal (Temp);
   begin
      Free (Temp);
      return R;
   end CreateFromFile;

我在 ASFML 库中的任何位置都找不到它试图引用的文件。是不是被遗漏了?

到目前为止,我已经成功在 Alire 中构建了 ASFML

alr get asfml
cd asfml
alr build asfml

这效果很好。然后我成功导入到我的项目中

cd myproj
alr myproj with asfml

再次,做题。然后我尝试构建它(在纠正 ranlib 错误之后),并且我得到了相同的链接器错误负载。我不明白为什么,因为我在用 Alire 导入它之前成功构建了 asfml 库。这只是我丢失的一个文件,还是我必须明确告诉链接器 asfml 文件在哪里?

一些错误。

Compile
   [Ada]          alicegame.adb
Build Libraries
   [gprlib]       asfml.lexch
   [link library] libasfml.dll
c:/gnat/2021/bin/../libexec/gcc/x86_64-w64-mingw32/10.3.1/ld.exe: C:\Users\Amynu\alicegame\alire\cache\dependencies\asfml_2.5.2_b775db19\obj\sf-audio-music.o:sf-audio-music.adb:(.text+0x32): undefined reference to `sfMusic_createFromFile'
c:/gnat/2021/bin/../libexec/gcc/x86_64-w64-mingw32/10.3.1/ld.exe: C:\Users\Amynu\alicegame\alire\cache\dependencies\asfml_2.5.2_b775db19\obj\sf-audio-soundbuffer.o:sf-audio-soundbuffer.adb:(.text+0x22): undefined reference to `sfSoundBuffer_createFromFile'
© www.soinside.com 2019 - 2024. All rights reserved.