1

我正在尝试使用 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 提供给我的编译器,但仍然无济于事。我尝试了三台不同的机器,都失败了。

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

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

可以在此链接中访问该文件。

4

1 回答 1

1

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

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

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

于 2012-08-06T09:29:43.433 回答