我正在尝试使用 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 文件也被排除在外)。
可以在此链接中访问该文件。