LINUX.ORG.RU

PostgreSQl и C-функции или чем отличаются .o файлы от .so?


0

0

Есть серьезная проблема. Пишу функции для PostgreSQL на C. Изучил подробно инструкцию, но реазовать это на практике не получается. Молча без ошибок эти функции не работают :( Функции компиляю с #include "postgres.h" в .o библиотеки, всю жинь считал что это одно и тоже что и .so... Если кто с этим сталкивался поместите сюда пожалуйста небольшой пример. Зарание спасибо.

anonymous

.so файлы - это dll'ки. Фактически для ее сборки используются те-же объектники, что и для обычной статической либы. Единственное отличие - при компиляции надо указать что код будет PIC ( Position Independent Code ). В gcc это -fpic -fPIC. После этого объектники линкуются в одну общую либу, которая при запуске будет опять линковаться :) к бинарику. .o файлы - это объектники, которые для удобства объединяют в архив, получая при этом .a файл. При линковке (ключ -l i.e. -lm) линкер подставляет вместо -l lib, и получает libm. Затем он ищет сначала libm.so ( если поддерживаются dll ), а потом уже libm.a . А скомпоновать бинарик со своим объектником можно просто указав имя объектника в списке файлов для линковки/компиляции.

timur
()

А немогли бы вы укзать ссылку на эту информацию, в электронном или печатном виде. Не в одном хелпе нинашел ничего толкового по созданию библиотек. :(

anonymous
()

Есть серьезная проблема. - согласен.
Изучил подробно инструкцию... - это вряд ли.
...всю жизнь считал что это одно и тоже... - тогда это не лечится.

libxyz.a в данном случае совершенно ни к селу, ни к городу, т.к.
postgres на лету связывает тип данных и его методы, которые затем
и ищет во внешних пользовательских .so библиотеках.

Только gcc -fPIC ... мало, надо собрать .so. Как минимум что-то вроде:
$(CC) $CFLAGS) -fPIC -c $@.c
$(LD) -shared -o xyz.so.0.1 -soname xyz.so $@.o
и добавить /etc/ld.so.conf. 

anonymous
()

Ну если уж быть настолько точным, то добавление в ld.so.conf тоже ни к селу, ни к городу ( если конечно верить этому - "postgres на лету связывает тип данных и его методы, которые затем и ищет во внешних пользовательских библиотеках" ).

timur
()
Ответ на: комментарий от timur

Да по поводу того, что библиотеки и обьектники одно и тоже я прогнал, аж самому стыдно. :( Но проблема к сожалению осталась для примера создал файл:

  • --------test.c---------
  • int add_one(int n)
  • {
  • return n+1;
  • }
  • ----end test.c---------
  • Компилял в точности как было указано ниже. Даже указал путь в ld.conf и запуситил ldconfig. Но упрямый постгрес твердит что ненаходит функцию в нутри это библиотки. вызываю ее запросом:
  • SELECT add_one(1) AS result;
  • Возможно эту функцию необходимо обьявить как экспортную, но я опять же незнаю как. :( Подскажите плиз где здесь могут быть грабли...

    anonymous
    ()
  • Попробуй strace/ltrace на предмет вызовов dlopen и dlsym . Там будет сразу все понятно. А экспортировать функции не нужно, о них и так достаточно инфы в so'шке.

    timur
    ()

    Может чего не понял, но: gcc -shared file1.o file2.o file3.o -o libsaper.so - это соберет filex.o в библиотеку libsaper.so, потом, чтобы использовать ф-ии ... из filex.o пиши gcc myprog.c -lsaper, только libsaper.so сначала закмнь в какой-нибудь lib (например /lib).

    saper ★★★★★
    ()

    offtopic

    offtopic: Ослиный вопрос: dllки это что такое (Dynamic Link Library в win16/32?)
    Но в Linux различают static/shared/dynamic libs, под dll вы подразумеваете какую ? 

    yaroslav_v
    ()

    Может я что-то не понимаю ? По моему dynamic и shared это одна и та же либа, которую можно линковать и при сборке ( так работает например libc, libgtk+, libcrypt ...., и в этом случае она нужна на момент сборки ), и при запуске ( так работают все плагины, на момент сборки она не нужна, а линкуется с помощью функций dl*** ). Либа одна, а компоновки две - shared и dynamic. А dll - это общее название для этой фишки, не имеющее никакого отношения к windows.

    timur
    ()

    Народ (люди)! Не препирайтесь промеж собой, а отвечайте вопрошавшему,
    если можете. Уже так заср... тред, что ни найдешь ни ответа, ни тех
    кто знает, ни тех кто не знает.
    
    Тому кто спросил: а sqlная часть не забыта?
    Наподобие:
    CREATE FUNCTION тра-та-та_in ( тра-та-та )
    RETURNS тра-та-та
    AS '/path-to-libs/xyz.so'
    LANGUAGE 'c';
      а также _out и CREATE TYPE ? 

    anonymous
    ()
    Ответ на: комментарий от master

    Кинь плиз на custos@forest.obninsk.org. Впринципе я разобрался как это дело компилять. Проблема было действительно в том, что я не .so файлы подсовывал... :) Но возникло еще пара проблем с параметрами к функции :(

    anonymous
    ()

    просто .o это обьектный файл этот файл низя юзать как либу а вот .so это и есть либы shared library. для комиляции динамически либо сатически нужно использовать архивные файлы .a которые являються архивами .o файлов

    anonymous
    ()
    Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.