Линкова dll при компиляции для модуля на Си

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
unclechu
новенький
Сообщения: 15
Зарегистрирован: 29.06.2012 06:11:58

Линкова dll при компиляции для модуля на Си

Сообщение unclechu »

Доброго времени суток! Следующая ситуация: я кое-чего пишу с использованием fmod, в безуспешных попытках нарулить чисто на паскале работу с fmod, пытаясь использовать всякие штуки типа JEDI-SDL, плюнул и решил написать обёртку на C, и просто использовать пару абстрактных функций уже из FPC. Нужно линковать либу libfmodex.so для работы, в gcc просто дописывается файл при компиляции. Но тут мы же просто делаем объектный файл и используем его в FPC:

Код: Выделить всё

{$link fmod_c_module.o}
{$linklib c}

А потом как компилировать уже через Free Pascal и прилинковывать libfmodex.so? И в частности, если не сложно, как это делать также в Lazarus? Спасибо.
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

прилинковывать libfmodex.so?


Может я не понял вопроса. Но so это сокращение от shared object или если вам винда ближе это тупо DLL. Но не просто либа, а либа скомпиленная с флагом PIC (позиционно независимый код) и его это код, просто нельзя прилинковать... Нужно вызывать функции ОС для загрузки либы, и нахождения адреса функции и т.п.

Анатомия динамических библиотек Linux
unclechu
новенький
Сообщения: 15
Зарегистрирован: 29.06.2012 06:11:58

Сообщение unclechu »

Maxizar писал(а):
прилинковывать libfmodex.so?


Может я не понял вопроса. Но so это сокращение от shared object или если вам винда ближе это тупо DLL. Но не просто либа, а либа скомпиленная с флагом PIC (позиционно независимый код) и его это код, просто нельзя прилинковать... Нужно вызывать функции ОС для загрузки либы, и нахождения адреса функции и т.п.

Анатомия динамических библиотек Linux

Именно SO, потому как для Линукса, но это не суть, когда дело до венды дойдёт, там будет dll. Смысл в том, что fmod — это проприетарщина, и они просто выдают тебе уже готовую .so .dll .dylib, которую в gcc например можно подключить так:

Код: Выделить всё

gcc -o program program.c libfmodex.so

Но это делается уже при компиляции конечного бинарника, а не объектного файла. А в FPC проект я подключаю именно объектный файл, созданный в GCC, и как для FPC передать линковку на эту либо я пока не представляю, потому и спрашиваю.

Добавлено спустя 6 минут 6 секунд:
Наверное это должно происходить как-нибудь так: {$linklib libfmodex}
Но Lazarus говорит:
/usr/bin/ld: skipping incompatible ./libfmodex.so when searching for -lfmodex
/usr/bin/ld: skipping incompatible .//libfmodex.so when searching for -lfmodex
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

FPC использует тот же самый линкер, что и gcc, поэтому разницы в подходе нет: передаются имена всех объектных и .so файлов, а дальше оно само разбирается кто есть who.
Сообщение "/usr/bin/ld: skipping incompatible ./libfmodex.so when searching for -lfmodex" говорит о том, что файл fmodex.so несовместим с той платформой, для которой создается исполняемый файл.
unclechu
новенький
Сообщения: 15
Зарегистрирован: 29.06.2012 06:11:58

Сообщение unclechu »

Sergei I. Gorelkin писал(а):Сообщение "/usr/bin/ld: skipping incompatible ./libfmodex.so when searching for -lfmodex" говорит о том, что файл fmodex.so несовместим с той платформой, для которой создается исполняемый файл.

А как сделать его совместимым? Простите, может у меня плохо с мат-частью, но почему тогда gcc успешно его применяет без бубнов и шаманств?.

Добавлено спустя 9 минут 38 секунд:
Разобрался. Компилятор работает в режиме x64, а либу я ему подсовывал x32, ему это не нравится. Подсунул x64, всё собралось {$linklib libfmodex64}
Тогда вопрос, прошу прощения если не по теме, как компилятору сказать, чтоб он в 32-битном режиме делал бинарники? То-есть я сейчас получается в принципе 64-бит бинарники делаю, а как 32-битные сделать?
Kitayets
постоялец
Сообщения: 174
Зарегистрирован: 05.05.2010 21:15:24

Сообщение Kitayets »

поставь 32-битный компилятор fpc.

Например на fedora linux есть 2 пакета:
fpc-<версия>.i686.rpm и fpc-<версия>.x86_64.rpm и допустим что у меня уже установлен компилятор для 64 бит, то я пишу в консоли:
sudo yum install fpc-<версия>.i686
и yum мне накатывает мне 32 битный компилятор со всеми зависимостями.
Ответить