URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5093
[ Назад ]

Исходное сообщение
"Как использовать библиотеки написаные не на С"

Отправлено halt , 28-Янв-06 13:12 
День добрый.
Подскажите как можно использовать so`шки в проге на С. сами библиотеки написаны в куликсе на паскале.

Нашел такой код
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
    void *dllptr;
    int (*mmm)(void);
             dllptr = dlopen("./liblib.so", RTLD_LAZY);
    mmm = (int (*)(void))dlsym(dllptr, "xxz");
    mmm();
    dlclose(dllptr);  
}
только вот при компиляции вылазит ошибка

p3.cpp:22: undefined reference to `dlopen'
p3.cpp:23: undefined reference to `dlsym'
p3.cpp:25: undefined reference to `dlclose'

я так понимаю это он ругается по поводу что незнает эти функции. но если написать для прикола в проге dlopen(); ругается что не указаны параметы Char *, int.
Что это значит?


Содержание

Сообщения в этом обсуждении
"Как использовать библиотеки написаные не на С"
Отправлено chip , 30-Янв-06 13:09 

>Что это значит?

http://www.google.ru/search?hl=ru&q=undefined+reference+to+&...'&btnG=п÷п╬п╦я│п╨+п╡+Google&lr=


"Как использовать библиотеки написаные не на С"
Отправлено kir , 30-Янв-06 15:04 

а вы уверены что у вас есть dlfcn.h ?


"Как использовать библиотеки написаные не на С"
Отправлено chip , 30-Янв-06 15:18 
>
>а вы уверены что у вас есть dlfcn.h ?

У человека ошибка линковщика (undefined reference), а не компилятора. Стадия компляции уже завершилась успешно.


"Как использовать библиотеки написаные не на С"
Отправлено tilde , 30-Янв-06 15:54 
>День добрый.
>Подскажите как можно использовать so`шки в проге на С. сами библиотеки написаны
>в куликсе на паскале.
>
>Нашел такой код
>#include <dlfcn.h>
>#include <stdio.h>
>#include <stdlib.h>
>#include <sys/types.h>
>
>int main(int argc, char *argv[])
>{
> void *dllptr;
> int (*mmm)(void);
>            
> dllptr = dlopen("./liblib.so", RTLD_LAZY);
> mmm = (int (*)(void))dlsym(dllptr, "xxz");
>  mmm();
> dlclose(dllptr);
>}
>только вот при компиляции вылазит ошибка
>
>p3.cpp:22: undefined reference to `dlopen'
>p3.cpp:23: undefined reference to `dlsym'
>p3.cpp:25: undefined reference to `dlclose'
>
>я так понимаю это он ругается по поводу что незнает эти функции.
>но если написать для прикола в проге dlopen(); ругается что не
>указаны параметы Char *, int.
>Что это значит?

dlopen и т. д. находятся в libdl, то есть линковать нужно с опцией -ldl


"Как использовать библиотеки написаные не на С"
Отправлено tilde , 30-Янв-06 15:55 
Только какое отношение имеет существо вопроса к теме?
libdl и dlopen - более-менее стандартные функции библиотеки Си.

"Как использовать библиотеки написаные не на С"
Отправлено Niam , 30-Янв-06 15:57 

>Что это значит?

Это значит, что Вы не знаете ни языка С ни компиляторов/линкеров.
Конечно, если просто оставить без параметров вызовы ф-ций, то компилятор будет ругаться.

А то, что вылазят ошибки при компиляции о том, что неизвестные ссылки - это ошибки линкера - надо подключить библиотеку - поставте -ldl с строку с выполнением gcc им все у Вас получится!


"Как использовать библиотеки написаные не на С"
Отправлено halt , 30-Янв-06 19:51 
>А то, что вылазят ошибки при компиляции о том, что неизвестные ссылки
>- это ошибки линкера - надо подключить библиотеку - поставте -ldl
>с строку с выполнением gcc им все у Вас получится!

Благодарю за советы. да это оказалась -ldl, все олтлично собралось.
Но тут же возникла другая проблема т.к. я на С пишу первые пять минут сподкнулся вот вчем:
Как передать в качестве параметра функцие из soкши строку? сама функция написана на паскале и допустим выглядит так
function writestr(str: string):integer;



"Как использовать библиотеки написаные не на С"
Отправлено Niam , 30-Янв-06 20:54 
>>А то, что вылазят ошибки при компиляции о том, что неизвестные ссылки
>>- это ошибки линкера - надо подключить библиотеку - поставте -ldl
>>с строку с выполнением gcc им все у Вас получится!
>
>Благодарю за советы. да это оказалась -ldl, все олтлично собралось.
>Но тут же возникла другая проблема т.к. я на С пишу первые
>пять минут сподкнулся вот вчем:
>Как передать в качестве параметра функцие из soкши строку? сама функция написана
>на паскале и допустим выглядит так
>function writestr(str: string):integer;


Будет довольно проблематично, поскольку строки в паскале и в с отличаются!
Если Ви можете переделать ф-цию на паскале - будет оченб хорошо, и принимать ф-ция будет массив символов. Можно попробовать извернуться таким образом - переделать строку в котором первый символ - длина строки(правда ограничение - до 255 символов). Есть еще проблема - надо все время самому контролировать этот первый символ и постоянно делать сдвиг.

чтоб было проще делать сдвиг - можно обыграть на указателях =

char *str1 = "bla,bla";
char *str2 = str1+1;

printf("%s",str2);// output => la,bla


"Как использовать библиотеки написаные не на С"
Отправлено halt , 30-Янв-06 21:20 

>Будет довольно проблематично, поскольку строки в паскале и в с отличаются!
>Если Ви можете переделать ф-цию на паскале - будет оченб хорошо, и
>принимать ф-ция будет массив символов. Можно попробовать извернуться таким образом -
>переделать строку в котором первый символ - длина строки(правда ограничение -
>до 255 символов). Есть еще проблема - надо все время самому
>контролировать этот первый символ и постоянно делать сдвиг.
>
>чтоб было проще делать сдвиг - можно обыграть на указателях =
>
>char *str1 = "bla,bla";
>char *str2 = str1+1;
>

пока сам не сталкнулся не воспринимал серьезность различия паскалевски строк и сишных. ну в моем случае монжно попробовать переделать под 2 параметра 1) длина сроки 2) сам массив.

Спасибо за совет

>printf("%s",str2);// output => la,bla



"Как использовать библиотеки написаные не на С"
Отправлено Brick , 31-Янв-06 03:11 
Насколько я знаю, в Паскале string -это обычный char var[255], где var[0] - это длина строки

"Как использовать библиотеки написаные не на С"
Отправлено tilde , 31-Янв-06 10:05 
>Насколько я знаю, в Паскале string -это обычный char var[255], где var[0]
>- это длина строки

В Delphi (aka Kylix) еще бывают "длинные" строки, в которых длина хранится в первых 4 байтах как значение типа integer.


"Как использовать библиотеки написаные не на С"
Отправлено landor , 05-Фев-06 19:31 
Слушайте-ка, а вы не думали что даже unix'совые компиляторы паскаля исползуют прямую конвенцию, а не обратную как в С. У каждого из этоих языков компиляторы традиционно работают с передачей параметров именно таким образом. Короче говоря, если библиотеки созданы используя классическую конвенцию паскалевых компиляторов, то передача параметров в их ф-и из С - дохлое напроч дело. Вроде в прототипах ф-и в C нельзя указать спецификатор паскалевой ф-и.
   Перепишите все на С, тем более вам это необходимо, раз недавно занялись С'шником.

"Как использовать библиотеки написаные не на С"
Отправлено landor , 07-Фев-06 18:46 
И ещё: (это также к передеаче параметров) в С\С++ компиляторах опать-же традиционно стек от параметров освобождается после инструкции вызова ф-и, а в паскалевых она делает это сама. В паскале есть вложенные ф-и... хотя это наплевать. Но вот прототип ф-и:
void dlopen();
будет искаться как _dlopen, паскалевый компиллер врядли догадается это предусмотреть(хотя не знаком с unix'овыми комп. паскаля). Вот 100% способ в таком случае:
asm("extern dlopen \n"
     pushl %eax \n" //1-й аргумет
     pushl %ebx \n" //2-й аргумет
     call dlopen \n");//очищать стек от параметров потом не надо
(не знаток AT&T стиля, но по сути так).
Как видно вариант для извращенцев - так что лучше пиши на С\С++.