2010-06-25 6 views
25

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

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

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

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

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

Может ház учебника?

== Edit ==

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

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

Видимо, библиотека вопрос является 32-разрядное в конце концов?

+1

Эта библиотека определенно 32-битная? Попробуйте 'файл/dvlpmnt/libPI-Http.a' – Rup

+0

@Rup: это, скорее всего, говорит« текущий архив », что не очень полезно. Вы должны получить файл в архиве, как показано в моем ответе. –

+0

Пожалуйста, разместите командную строку компоновщика ... вы правы, похоже, что библиотека 32-разрядная, но, возможно, компоновщик ищет 64-битные библиотеки, несмотря на то, что вы считали, что сделали. –

ответ

28

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

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

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

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

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

+1

Простите, вы правы. Я использовал CFLAGS вместо CTAGS: P –

+0

В дополнение к этому решению вы можете добавить '' -Wl, - no-warn-search-mismatch'' к вашему 'CFLAGS', таким образом, эти предупреждения будут подавлены. –

9

Обычно это не ошибка как таковая; это предупреждение о том, что первый найденный файл, который соответствует аргументу -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» шаг говорит вам, какой тип объектных файлов в архиве. Остальные просто убеждаются, что вы не делаете беспорядок, который не может быть легко очищен.

+1

Да, это странно, этот шаг теперь показывает мне, что все библиотеки, о которых идет речь, фактически являются 32-битными. o__o –

+1

@defaultstring: Какова фактическая ссылка для командной строки? Включает ли он флаг '-m32'? Добавьте это как дополнительную информацию в вопрос, а не как дополнительный комментарий здесь, пожалуйста. –