Пропуск несовместимых библиотек при компиляции
Когда я пытаюсь скомпилировать копию моего проекта на моем локальном компьютере, я получаю сообщение о том, что он пропускает несовместимые библиотеки. Это не тот случай, когда я возился с живой версией, размещенной на сервере на работе [она отлично работает].
Различные другие сайты заставили меня поверить, что это может быть проблемой среды, поскольку я разрабатываю 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-битная?
Ответы
Ответ 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
указывает, какие типы объектных файлов находятся в архиве. Остальное просто убеждается, что вы не делаете беспорядок, который нелегко очистить.