【问题标题】:g++ creating static library: could not read the symbols archive has no indexg ++创建静态库:无法读取符号存档没有索引
【发布时间】:2012-08-05 22:09:21
【问题描述】:

我正在尝试使用 g++ 将多个 SDL 实用程序类分组到 C++ 的静态库中。我正在使用 ubuntu linux 11.10 和 gcc 版本 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)。 ar的版本是2.21.53.20110810。

由于所有文件都很小,我目前只使用头文件。我提到这一点,以防它与问题有关。此外,大多数头文件都使用 -lSDL 编译为目标代码(我不确定这是否正确甚至相关,但无论哪种方式都失败了)。最后,两个不同的类有几个静态成员,在它们自己的文件中定义,以包含在流程的最后步骤中(尝试遵循 ODR)。

问题是,每个文件都被编译成目标代码就好了,然后使用 ar 创建一个存档,但是当我尝试编译主文件并将它链接到我的新库时(我是 libDanGfx.a创建):

g++ -Wall -ansi -pedantic newmain.cpp -L。 -lSDL -lDanGfx

我收到此错误:

./libDanGfx.a:无法读取符号:存档没有索引;运行ranlib添加一个

即使在删除所有档案和目标代码后也会发生这种情况。

我已经搜索了该站点,但还没有找到问题的答案。使用 ranlib 根本没有帮助,还尝试将 -m32 提供给我的编译器,但仍然无济于事。我在三台不同的机器上试过,都失败了。

弗兰基,我正在考虑删除整个存档文件,更新 makefile 并仅链接目标文件,但我真的很想知道这里发生了什么,并在此过程中学到一些东西。

我预计会丢失很多信息,所以为了以防万一,我上传了一个包含整个内容的 .tar.gz 文件(只需解压缩并尝试 makefile)。为了您的阅读,所有的 .o 文件都将位于 objects 目录中,并且使用的每个命令都可以在 makefile 中读取。另外,main 应该在屏幕上显示一些无脑的东西(可能是红色方块,因为资源文件没有上传以节省空间,当然 .o 和 .a 文件也被排除在外)。

文件可以到达in this link

【问题讨论】:

  • 您是否尝试执行错误消息中说您应该执行的操作? IE。运行命令ranlib?
  • 约阿希姆:感谢您的回复。正如我提到的“使用 ranlib 根本没有帮助”。尝试了我在其他问题中看到的其他一些东西(主要是在目标文件上运行“文件”以查看它们是否吐出预编译的头文件)但一无所获。

标签: c++ g++ sdl static-libraries unix-ar


【解决方案1】:

再次阅读您的问题并检查存档,您只有头文件中的代码?但是你不能创建一个库!头文件用于包含在源文件中,而不是编译为目标文件!

将标头拆分为仅包含声明的正确头文件,并将定义(即实现)放入源文件中。将源文件编译成用于创建库的目标文件。

如果没有“实现”并且所有代码都内联在头文件中,则不需要制作库,只需包含想要的头文件即可。

【讨论】:

  • 您好 Joachim:再次感谢您的快速回答!!!。一定是这样的,当然……我以为这上面有什么奇怪的东西,但没有多想。我会尽快尝试,但首先,那里有一些模板,我无法使用 .cpp 生成 .o 文件,对吧?我该怎么处理这些?。
  • @TheMarlboroMan 模板必须全部在头文件中,尽管非模板化的帮助函数可能仍然在源文件中。如果代码足够小,可以很容易地内联,那么可以有一个仅头文件的库(即没有要链接的库,只包含要包含的头文件)。
  • Joachim:这很简单(我只是在每个 cpp 的头文件中添加了包含...稍后我将把实现放在那里)。编译器在这台计算机上根本没有抱怨。我稍后会在家里尝试。非常感谢您抽出宝贵的时间,提供有关头文件的提示,当然还有帮助!内联代码位确实帮助我下定了决心,因为我倾向于编写小类。 (编辑:由于声誉低,无法投票,抱歉)。
猜你喜欢
  • 1970-01-01
  • 2011-11-03
  • 2011-07-30
  • 2021-09-02
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
相关资源
最近更新 更多