g++ создает статическую библиотеку: не удалось прочитать, архив символов не имеет индекса

Я пытаюсь сгруппировать несколько служебных классов SDL в статическую библиотеку для С++, используя g++. Я использую Ubuntu Linux 11.10 и gcc версии 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3). Версия ар 2.21.53.20110810.

Поскольку все файлы маленькие, в настоящее время я использую только заголовочные файлы. Я упоминаю об этом на случай, если это как-то связано с проблемой. Кроме того, большинство заголовков компилируются в объектный код с параметром -lSDL (я не уверен, что это правильно или даже уместно, но в любом случае это не работает). Наконец, есть пара статических членов для двух разных классов, определенных в их собственном файле, которые должны быть включены на последних этапах процесса (попытка следовать ODR).

Дело в том, что каждый файл прекрасно скомпилирован в объектный код, затем архив создается с использованием ar, но когда я пытаюсь скомпилировать основной файл и связать его с моей новой библиотекой, как это (будучи libDanGfx.a архивом, который я создаю):

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

Я получаю эту ошибку:

./libDanGfx.a: не удалось прочитать символы: в архиве нет индекса; запустите ranlib, чтобы добавить один

Это происходит даже после удаления всех архивов и объектного кода.

Я изучил сайт и не нашел ответа на проблему. Использование ranlib вообще не помогло, также пытался передать -m32 моему компилятору, но все равно безрезультатно. Пробовал на трех разных машинах, все неудачно.

Фрэнки, я подумываю отказаться от всего этого архива, обновить make-файл и просто связать объектные файлы, но я действительно хочу знать, что здесь происходит, и немного узнать в процессе.

Я ожидаю, что много информации будет отсутствовать, поэтому на всякий случай я загрузил файл .tar.gz со всем этим (просто распакуйте и попробуйте makefile). Для вашего просмотра все файлы .o будут находиться в каталоге объектов, и каждую используемую команду можно будет прочитать в make-файле. Кроме того, на главном экране должны отображаться какие-то бессмысленные вещи (вероятно, красные квадраты, поскольку файлы ресурсов не загружаются для экономии места, конечно, файлы .o и .a также исключены).

Файл доступен по этой ссылке.


person The Marlboro Man    schedule 05.08.2012    source источник
comment
Вы пытались сделать то, что в сообщении об ошибке сказано, что вы должны сделать? т.е. выполнить команду ranlib?   -  person Some programmer dude    schedule 06.08.2012
comment
Йоахим: Спасибо за ответ. Как я уже упоминал, использование ranlib вообще не помогло. Пробовал некоторые другие вещи, которые я видел в других вопросах (в основном, запуск файла в объектных файлах, чтобы увидеть, выплевывают ли они предварительно скомпилированные заголовки), но ничего не получил.   -  person The Marlboro Man    schedule 06.08.2012


Ответы (1)


Прочитав еще раз ваш вопрос и проверив архив, у вас есть код только в заголовочных файлах? Но тогда вы не можете создать библиотеку! Заголовочные файлы предназначены для включения в исходные файлы, а не для компиляции в объектные файлы!

Разделите заголовки на правильные файлы заголовков, содержащие только объявления, и поместите определения (т. е. реализацию) в исходные файлы. Скомпилируйте исходные файлы в объектные файлы, которые используются для создания библиотеки.

Если нет «реализации» и весь код встроен в заголовочные файлы, вам не нужно создавать библиотеку, просто включите нужный заголовочный файл.

person Some programmer dude    schedule 06.08.2012
comment
Привет, Йоахим: Еще раз большое спасибо за очень быстрый ответ!!!. Это должно быть так, конечно... Я подумал, что в этом есть что-то странное, но не придал этому особого значения. Я попробую это как можно скорее, но во-первых, там есть несколько шаблонов, которые я не смогу генерировать .o-файлы с .cpp, верно? Что мне с ними делать? - person The Marlboro Man; 06.08.2012
comment
Все шаблоны @TheMarlboroMan должны быть в файлах заголовков, хотя вспомогательные функции без шаблонов могут по-прежнему находиться в исходных файлах. Если код достаточно мал, чтобы его можно было легко встроить, то вполне нормально иметь библиотеку только для заголовков (т.е. нет библиотеки для компоновки, только файлы заголовков для включения). - person Some programmer dude; 06.08.2012
comment
Йоахим: Это сработало с небольшими трудностями (я только что добавил включения в заголовочный файл в каждом cpp... Позже я добавлю туда реализацию). Компилятор вообще не жаловался на этом компьютере. Попробую позже дома. Большое спасибо за ваше время, советы по поводу заголовочных файлов и, конечно же, помощь!. Часть встроенного кода действительно помогла мне принять решение, поскольку я обычно пишу небольшие классы. (Редактировать: не могу проголосовать из-за низкой репутации, извините). - person The Marlboro Man; 06.08.2012