2015-03-02 1 views
2

Многое исследование здесь и углубленное исследование через ссылки Google, но безрезультатно.Связывание статической библиотеки с Xcode в приложение Lazarus не соответствует несоответствию архитектуры

Я создал простую, одну функцию, статическую библиотеку C с OSX Xcode (5), которую я пытаюсь связать в приложении Lazarus, в основном для переноса функции Xcode с Xcode на Lazarus.

Xcode создает статическую библиотеку в порядке, и у меня есть то, что, кажется, правильный код связи в приложении Lazarus, следующим образом:

type 
byteptr = ^byte; 

const 
libname = 'libLORaudio.a'; 

function LORaudioPlay (fd : longint; audio : byteptr): Integer; 
    cdecl; external libname; 

r := LORaudioPlay(e, z); 

Все это компилируется нормально, но сборка не может с следующие сообщения:

Id: symbol(s) not found for architecture i386 
Id: Warning: ignoring file libLORaudio.a, file was built for archive which is not the architecture being linked (i386): libLORaudio.a 

(and it goes on to say the function is undefined, of course, since it ignored the library that supplies it.) 

Моя проблема может быть решена одним из двух способов, ни один из которых я нашел достаточно информации о, онлайн, ни в Xcode или Lazarus.

Одним из решений было бы получить Xcode для создания статической библиотеки с архитектурой, ожидаемой от Lazarus. Я попробовал различные варианты установки архитектур построения в Xcode, упомянутых в других ответах здесь, на похожие вопросы, но, похоже, я не сделал их правильно, потому что никто из них не работал для меня.

Другим решением было бы заставить Lazarus принять архитектуру, создаваемую Xcode. Документация Laz.y не помогает в этом отношении.

Любые предложения, которые я мог бы попробовать? Большое спасибо за ваше внимание.

+0

Я бы предположил, что вы собрали свою библиотеку для архитектуры, отличной от архитектуры Lazarus/FPC (i386, как указано в предупреждающем тексте). Попробуйте установить 32-битную архитектуру в режиме сборки вашей библиотеки. – Abelisto

+0

@Abelisto Определенно несоответствие архитектуры. Я попробовал несколько способов заставить Xcode принять 32-битную спецификацию архитектуры, но он принял только «i386 x86_64», который был изначально. Есть ли какая-то задняя дверь в настройках сборки? – Lor

+0

Не уверен, я не знаком с OS X.Но вы также можете попытаться изменить целевую ОС и процессор в параметрах проекта Lazarus (страница «Конфигурация и цель»). [Здесь] (http://sourceforge.net/projects/freepascal/files/Mac%20OS%20X/2.6.4/) вы можете загрузить и установить соответствующий FPC. Вам нужно 'fpc-2.6.4.intel-ppc64-macosx.dmg', как я понимаю (проверьте версию, она должна быть такой же с уже установленным FPC). – Abelisto

ответ

2

Итак, в конце концов, я искал Finder и нашел, где (см. Ниже). Я создал объектные файлы x86_64 и i386 в отдельных попытках решить проблему. Это было сделано путем изменения настроек сборки для архитектур на «i386». Последующие повторные сборки для 'x86_64' не удаляли информацию об объекте i386 раньше.

Затем я скопировал объектный файл i386 в папку, содержащую проект Lazarus (необходимо было сделать копию с помощью метода перетаскивания alt-option, поскольку копия, а затем вставка не работала).

Там, я запустил ar на нем в терминале, как: 'ar -r -s libname.a name.o' для создания статической библиотеки с объекта.

Lazarus теперь обрабатывает библиотеку по своему усмотрению. (Это, конечно же, выявило некоторые другие ситуации с багги, с которыми нужно иметь дело, но, к сожалению, прогресс.)

Xcode поставил обе версии объекта в папку. Найдите эти продукты из Xcode, щелкнув правой кнопкой мыши на продукте, указанном в навигаторе проекта, и выберите «show in finder». Вы можете сделать это для любой архитектуры, которую вы в настоящее время имеете; оба ведут к тем же папкам сборки. Оттуда вернитесь к содержащимся папкам, пока не увидите «Сборка». Откройте это и проложите путь вперед среди содержащихся в нем папок, пока не дойдете до объектов, нормальных. Там вы найдете папки для i386 и x86_64. Каждая из этих папок содержит соответствующий файл объекта как name.o среди других связанных с продуктом файлов.