我正在尝试使用g++将许多SDL实用程序类分组到C++的静态库中。我使用的是ubuntu linux 11.10和gcc versión 4.6.1(ubuntu/Linaro 4.6.1-9ubuntu3)。ar的版本是2.21.53.20110810。
由于所有文件都很小,我目前只使用头文件。我提到这一点,以防与问题有关。此外,大多数头都是用-lSDL编译成对象代码的(我不确定这是否正确,甚至不确定是否相关,但无论哪种方式都失败了)。最后,有两个不同类的静态成员,它们在自己的文件中定义,将包含在流程的最后步骤中(triyng遵循ODR)。
问题是,每个文件都被编译成对象代码,然后使用ar创建一个档案,但当我试图编译主文件并将其链接到我的新库时,如下所示(libDanGfx.a是我正在创建的档案):
g++-华尔街-迂腐的newmain.cpp-L-lSDL-lDanGfx
我得到这个错误:
/libDanGfx.a:无法读取符号:档案没有索引;运行ranlib添加一个
即使在删除所有存档和对象代码之后,也会发生这种情况。
我搜索过这个网站,还没有找到这个问题的答案。使用ranlib没有任何帮助,还尝试将-m32提供给我的编译器,但仍然没有效果。我试了三台不同的机器,都失败了。
Franky,我正在考虑放弃整个归档,更新makefile,只链接到对象文件,但我真的想知道这里发生了什么,并在这个过程中学习一些。
我预计会丢失很多信息,所以为了以防万一,我上传了一个.tar.gz文件和整个文件(只需解压并尝试makefile)。为了便于阅读,所有的.o文件都将在objects目录中,并且使用的每个命令都可以在makefile中读取。此外,main应该在屏幕上显示一些无意识的东西(可能是红色方块,因为资源文件没有上传以节省空间,当然,.o和.a文件也被排除在外)。
可以通过此链接访问该文件。
再次阅读您的问题并检查存档,您是否只有头文件中的代码?但是你不能创建一个库!头文件用于包含在源文件中,而不是编译成对象文件!
将头分解为只包含声明的适当头文件,并将定义(即实现)放入源文件中。将源文件编译为用于创建库的对象文件。
如果没有"实现",并且所有代码都在头文件中内联,则不需要创建库,只需包含所需的头文件即可。