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

Пропуск несовместимых библиотек при компиляции

Когда я пытаюсь скомпилировать копию моего проекта на моем локальном компьютере, я получаю сообщение о том, что он пропускает несовместимые библиотеки. Это не тот случай, когда я возился с живой версией, размещенной на сервере на работе [она отлично работает].

Различные другие сайты заставили меня поверить, что это может быть проблемой среды, поскольку я разрабатываю 64-разрядный дистрибутив Ubuntu, и я предполагаю, что версия сервера работает на 32-разрядной версии. Тем не менее, после установки моих переменных окружения:

CFLAGS+=" -m32"
CXXFLAGS+=" -m32"

Я все равно получаю ту же ошибку компиляции:

/usr/bin/ld: skipping incompatible /dvlpmnt/libPI-Http.a when searching for -lPI-Http

Может ли учебник по обучению?

== Edit ==

Это был результат, который я получил после того, как я последовал совету Джонатана:

http.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

По всей видимости, библиотека, о которой идет речь, все равно 32-битная?

4b9b3361

Ответ 1

Это сообщение на самом деле не является ошибкой - это просто предупреждение о том, что данный файл не имеет правильной архитектуры (например, 32-разрядная и 64-разрядная, неправильная архитектура ЦП). Компилятор продолжит искать библиотеку нужного типа.

Конечно, если вы также получаете ошибку вдоль строк can't find lPI-Http, то у вас есть проблема: -)

Трудно предположить, какое именно решение будет иметь, не зная деталей вашей системы сборки и make файлов, но вот несколько снимков в темноте:

  • Просто чтобы проверить: обычно вы добавляете флаги до CFLAGS, а не CTAGS - вы уверены, что это верный? (Что у вас может быть правильно - это будет зависеть от вашей системы сборки!)
  • Часто флаг нужно также передать в компоновщик - так что вам также может потребоваться изменить LDFLAGS

Если это не помогает - можете ли вы опубликовать полный вывод ошибки, а также действительную команду (например, gcc foo.c -m32 -Dxxx и т.д.), которая выполнялась?

Ответ 2

Обычно это не ошибка сама по себе; это предупреждение о том, что первый найденный файл, который соответствует аргументу -lPI-Http компилятору/компоновщику, недействителен. Ошибка возникает, когда никакая другая библиотека не может быть найдена с нужным контентом.

Итак, вам нужно посмотреть, не является ли /dvlpmnt/libPI-Http.a библиотекой 32-битных объектных файлов или 64-битных объектных файлов - она, скорее всего, будет 64-битной, если вы компилируете ее с опцией -m32. Затем вам нужно установить, есть ли альтернативный файл libPI-Http.a или libPI-Http.so где-то еще, 32-разрядный. Если это так, убедитесь, что каталог, который содержит его, указан в аргументе -L/some/where для компоновщика. Если нет, то вам нужно будет получить или построить 32-битную версию библиотеки где-нибудь.

Чтобы установить, что находится в этой библиотеке, вам может понадобиться:

mkdir junk
cd junk
ar x /dvlpmnt/libPI-Http.a
file *.o
cd ..
rm -fr junk

Шаг 'file указывает, какие типы объектных файлов находятся в архиве. Остальное просто убеждается, что вы не делаете беспорядок, который нелегко очистить.