Не удалось прочитать символы: у архива нет индекса; запустить 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
Пожалуйста, предложите мне некоторое решение для этого
Ответы
Ответ 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.