«Пропуск несовместим» на машине Blue Gene - PullRequest
4 голосов
/ 26 октября 2011

Я пытаюсь собрать протоколные буферы Google и Kyotocabinet на суперкомпьютере Blue Gene, который является машиной на базе PowerPC64 и работает под управлением Suse Linux, gcc 4.1.2.

Когда я компилирую свой код, оба буфера протокола Googleи Киотокабинет дал ошибку «пропуск несовместимого».Командная строка компиляции:

g++ -g -Xlinker -zmuldefs -I/some_path/include $sourceFile -o $fileName -L/some_path/lib -lkyotocabinet -lz -lstdc++ -lrt -lpthread -lm -lc -lprotobuf -lprotoc meta.pb.cc

Затем я изменил их установку, используя ./configure --host=powerpc-bgp-linux, на этот раз работает протокол протокола Google, но Kyotocabinet по-прежнему выдает эту ошибку, как показано ниже:

/usr/bin/ld: skipping incompatible /some_path/lib/libkyotocabinet.so when searching for -lkyotocabinet<br> /usr/bin/ld: skipping incompatible /some_path/lib/libkyotocabinet.a when searching for -lkyotocabinet<br> /usr/bin/ld: cannot find -lkyotocabinet<br> collect2: ld returned 1 exit status

Я проверил config.status из них, у Google Protocolbuffers есть что-то вроде этого

sys_lib_search_path_spec='/usr/lib/gcc/powerpc64-suse-linux/4.1.2 /usr/powerpc64-suse-linux/lib /usr/lib /lib'

Видимо, он знает, как найти нужные вещииспользовать.Но у Kyotocabinet нет таких настроек в config.status.Надеюсь, этот совет поможет.

Есть ли какое-нибудь решение, чтобы я мог использовать Kyotocabinet на BlueGene?Или я могу добавить несколько строк, как упомянуто выше, чтобы сообщить Киотокабинету, где найти правильную библиотеку?Или вы могли бы порекомендовать несколько быстрых магазинов ключей-значений?

1 Ответ

2 голосов
/ 26 октября 2011

Ваша проблема не в том, чтобы найти Киотокабинет. Ваша проблема в том, что библиотека, на которую вы указываете: /some_path/lib/libkyotocabinet.so, построена для несовместимой архитектуры (чаще всего ppc32).

Сделай file -L /some_path/lib/libkyotocabinet.so и посмотри, что там написано. Вы должны перестроить его для той же архитектуры, что и gcc по умолчанию.

Обновление: file говорит ELF 64-bit MSB shared object, 64-bit PowerPC. Но совпадает ли это с вашими g++ выходами по умолчанию? Что выводится из:

echo "int foo() { return 0; }" | g++ -xc++ - -c -o foo.o &&
file foo.o

Бьюсь об заклад выше, напечатает 32-bit PowerPC, в этом случае вам нужно добавить -m64 в вашу командную строку.

Обновление 2:

Есть идеи по этой проблеме ??

Вы не должны быть такими беспомощными. Вы понимаете, что проблема заключается в несовпадении библиотек, поэтому идите и исправьте это.

  1. Решите, хотите ли вы, чтобы последний двоичный файл работал в 32-битном или 64-битном режиме
  2. Получите или восстановите все библиотеки, которые вам нужны, в нужной вам битности
  3. Сборка финального бинарного файла
  4. Прибыль!
...