2009-11-13 2 views
0

У меня есть библиотека, скомпилированная в файл .a, связанный с моим приложением. (iphone, развивающийся с помощью Xcode)linking mess с libc

Все кажется прекрасным, ссылка кажется успешной, но когда я запускаю программу, она сработает. Точка сбоя - вызов memcmp() в статически связанной библиотеке. Отладчик показывает все виды вещей, называемых «dyld» в своих именах, поэтому кажется, что по какой-либо причине он не может решить memcmp, начинает искать динамические библиотеки, а затем терпит неудачу.

AFAIK memcmp находится в libc, поэтому не должно быть проблемой. (попробовал также передать -lc в компоновщик, и это не помогло, как я и ожидал)

Итак, как это должно работать? Почему не может статически связанная библиотека использовать что-либо из libc? Как его скомпилировать?

Спасибо

+1

С помощью библиотеки вы связались с заявлением, которое вы написали сами? - Я не могу не подозревать, что он использует неинициализированный или нулевой указатель. Или, может быть, вы неправильно используете библиотеку, которая вызывает недопустимый указатель? Что говорит задняя линия? –

+0

Нет, это широко используемая библиотека, надежно работающая на многих платформах, и она не работает с самого начала с функцией инициализации. Один и тот же фрагмент кода (на самом деле 2 вызова функции для настройки). Backtrace указывает на функцию memcmp. (библиотека была скомпилирована в режиме отладки) – 2009-11-17 15:48:33

ответ

0

Возможно, кто-то будет полезно, если я разделяю то, что проблема была:

библиотека не была составлена ​​для одной и той же версии ОС в качестве основной программы, поэтому он ожидал другое Libc, чем то, что он нашел при запуске ,

0

Libc по-видимому, динамически связаны на вашей платформе. Соответствующая версия не может быть найдена во время выполнения, чтобы удовлетворить зависимость, сгенерированную во время связи.

Я не могу объяснить, как это произойдет иначе, чем повреждение файловой системы или вызов chroot до того, как произойдет динамическое связывание (что может показаться маловероятным).

+0

Странно, что я могу вызвать memcmp() из моей основной программы, но библиотека все еще не может ее использовать. – 2009-11-17 15:49:18

+1

Некоторые компиляторы обрабатывают memcmp() как неотъемлемую. То есть, если вы это называете, он помещает код в место, чтобы реализовать его вместо вызова функции библиотеки. –