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

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

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

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

Сообщение unclechu » 30.06.2012 13:19:52

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

А потом как компилировать уже через Free Pascal и прилинковывать libfmodex.so? И в частности, если не сложно, как это делать также в Lazarus? Спасибо.
unclechu
новенький
 
Сообщения: 15
Зарегистрирован: 29.06.2012 06:11:58

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

Сообщение Maxizar » 30.06.2012 16:34:10

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


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

Анатомия динамических библиотек Linux
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

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

Сообщение unclechu » 01.07.2012 01:35:32

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
unclechu
новенький
 
Сообщения: 15
Зарегистрирован: 29.06.2012 06:11:58

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

Сообщение Sergei I. Gorelkin » 01.07.2012 02:15:54

FPC использует тот же самый линкер, что и gcc, поэтому разницы в подходе нет: передаются имена всех объектных и .so файлов, а дальше оно само разбирается кто есть who.
Сообщение "/usr/bin/ld: skipping incompatible ./libfmodex.so when searching for -lfmodex" говорит о том, что файл fmodex.so несовместим с той платформой, для которой создается исполняемый файл.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

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

Сообщение unclechu » 01.07.2012 05:17:57

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-битные сделать?
unclechu
новенький
 
Сообщения: 15
Зарегистрирован: 29.06.2012 06:11:58

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

Сообщение Kitayets » 07.07.2012 01:24:58

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

Например на fedora linux есть 2 пакета:
fpc-<версия>.i686.rpm и fpc-<версия>.x86_64.rpm и допустим что у меня уже установлен компилятор для 64 бит, то я пишу в консоли:
sudo yum install fpc-<версия>.i686
и yum мне накатывает мне 32 битный компилятор со всеми зависимостями.
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru