Подтвердить что ты не робот

Не удалось прочитать символы: у архива нет индекса; запустить runlib, чтобы добавить один

Я попробовал сделать библиотеку с

ar -r -c -s libtestlib.a *.o

как указано в этом уроке http://matrixprogramming.com/Tools/CompileLink.html

Но при связывании с библиотекой следующая ошибка приходит

g++ -o uni2asc uni2asc.o -L../Modules -ltestlib

../Modules/libtestlib.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status

Я тоже пробовал с ranlib, но все же ошибка пришла. im работает с ubuntu9.10 Пожалуйста, предложите мне некоторое решение для этого

4b9b3361

Ответ 1

Ваша команда архива выглядит отлично, вы можете попробовать следующее. 1) Получить объектные файлы в архиве/статической библиотеке

ar -t libtestlib.a

2) Для каждого объектного файла (скажем, foo.o) с шага 1

file foo.o 

Это сообщит вам формат объектного файла. Если объектный файл был скомпилирован для другой платформы, это приведет к сбою в создании индекса для архива. Чтобы исправить это, вам нужно будет перекомпилировать эти файлы.
3) Для каждого объектного файла с шага 1 сделайте

nm foo.o

Это отобразит символы, экспортированные из файла.

Ответ 2

Я использовал MinGW для компиляции приложения Windows, когда получил ошибку, поэтому нашел встроенные команды MinGW:

i686-w64-mingw32-ar

И

x86_64-w64-mingw32-ar

Попробуйте использовать те, а не ar, если вы столкнулись с проблемой в MinGW. Они оба фиксировали проблему вопроса для меня.

Ответ 3

libtool также имеет полезный вариант: -export-symbols-regexp.

Ответ 4

Я столкнулся с той же проблемой при попытке скомпилировать библиотеки NBIS. Существует опция для

make install LIBNBIS=yes

который создает один архив, содержащий другие архивные файлы. Компилятор gcc не обрабатывает это изящно и просто испускает сообщение Архив не имеет индекса. Исправление состоит в том, чтобы оставить архивы отдельными файлами

make install LIBNBIS=no

Затем просто привяжите приложение к требуемому архиву. Порядок подачи архива важен, чтобы убедиться, что компоновщик идентифицирует требуемые зависимости, а затем решает их при обработке файлов .a.