g++ создает статическую библиотеку: не может прочитать архив символов не имеет индекса
Я пытаюсь сгруппировать несколько классов утилит SDL в статическую библиотеку для C++, используя g++. Я использую 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 моему компилятору, но безрезультатно. Я пробовал на трех разных машинах, все они потерпели неудачу.
Фрэнки, я думаю о том, чтобы удалить весь этот архив, обновить make-файл и просто связать его с объектными файлами, но я действительно хочу знать, что здесь происходит, и немного узнать в процессе.
Я ожидаю, что будет отсутствовать много информации, поэтому на всякий случай я загрузил файл.tar.gz вместе со всем этим (просто распакуйте и попробуйте make-файл). На ваше усмотрение, все.o файлы будут находиться в каталоге объектов, и каждая используемая команда может быть прочитана в make-файле. Кроме того, основной должен отображать некоторые бессмысленные вещи на экране (возможно, красные квадраты, так как файлы ресурсов не загружаются для экономии места, конечно, файлы.o и.a также исключаются).
Файл можно найти по этой ссылке.
1 ответ
Читая ваш вопрос еще раз и проверяя архив, у вас есть только код в заголовочных файлах? Но тогда вы не можете создать библиотеку! Заголовочные файлы предназначены для включения в исходные файлы, а не для компиляции в объектные файлы!
Разделите заголовки на правильные заголовочные файлы только с объявлениями и поместите определения (то есть реализацию) в исходные файлы. Скомпилируйте исходные файлы в объектные файлы, которые используются для создания библиотеки.
Если нет "реализации" и весь код встроен в заголовочные файлы, вам не нужно создавать библиотеку, просто включите требуемый заголовочный файл.