g ++创建静态库:无法读取符号存档没有索引

时间:2012-08-05 22:09:21

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

我正在尝试使用g ++将许多SDL实用程序类分组到C ++的静态库中。我使用的是ubuntu linux 11.10和gccversión4.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文件(只需解压缩并尝试makefile)。对于您的浏览,所有.o文件都将位于对象目录中,并且每个使用的命令都可以在makefile中读取。此外,主要应该在屏幕上显示一些无意识的东西(可能是红色方块,因为资源文件没有上传以节省空间,当然,.o和.a文件也被排除在外)。

可以访问该文件in this link

1 个答案:

答案 0 :(得分:1)

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

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

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