День добрый.
Подскажите как можно использовать 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.
Что это значит?
>Что это значит?http://www.google.ru/search?hl=ru&q=undefined+reference+to+&...'&btnG=п÷п╬п╦я│п╨+п╡+Google&lr=
а вы уверены что у вас есть dlfcn.h ?
>
>а вы уверены что у вас есть dlfcn.h ?У человека ошибка линковщика (undefined reference), а не компилятора. Стадия компляции уже завершилась успешно.
>День добрый.
>Подскажите как можно использовать 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
Только какое отношение имеет существо вопроса к теме?
libdl и dlopen - более-менее стандартные функции библиотеки Си.
>Что это значит?Это значит, что Вы не знаете ни языка С ни компиляторов/линкеров.
Конечно, если просто оставить без параметров вызовы ф-ций, то компилятор будет ругаться.А то, что вылазят ошибки при компиляции о том, что неизвестные ссылки - это ошибки линкера - надо подключить библиотеку - поставте -ldl с строку с выполнением gcc им все у Вас получится!
>А то, что вылазят ошибки при компиляции о том, что неизвестные ссылки
>- это ошибки линкера - надо подключить библиотеку - поставте -ldl
>с строку с выполнением gcc им все у Вас получится!Благодарю за советы. да это оказалась -ldl, все олтлично собралось.
Но тут же возникла другая проблема т.к. я на С пишу первые пять минут сподкнулся вот вчем:
Как передать в качестве параметра функцие из soкши строку? сама функция написана на паскале и допустим выглядит так
function writestr(str: string):integer;
>>А то, что вылазят ошибки при компиляции о том, что неизвестные ссылки
>>- это ошибки линкера - надо подключить библиотеку - поставте -ldl
>>с строку с выполнением gcc им все у Вас получится!
>
>Благодарю за советы. да это оказалась -ldl, все олтлично собралось.
>Но тут же возникла другая проблема т.к. я на С пишу первые
>пять минут сподкнулся вот вчем:
>Как передать в качестве параметра функцие из soкши строку? сама функция написана
>на паскале и допустим выглядит так
>function writestr(str: string):integer;
Будет довольно проблематично, поскольку строки в паскале и в с отличаются!
Если Ви можете переделать ф-цию на паскале - будет оченб хорошо, и принимать ф-ция будет массив символов. Можно попробовать извернуться таким образом - переделать строку в котором первый символ - длина строки(правда ограничение - до 255 символов). Есть еще проблема - надо все время самому контролировать этот первый символ и постоянно делать сдвиг.чтоб было проще делать сдвиг - можно обыграть на указателях =
char *str1 = "bla,bla";
char *str2 = str1+1;printf("%s",str2);// output => la,bla
>Будет довольно проблематично, поскольку строки в паскале и в с отличаются!
>Если Ви можете переделать ф-цию на паскале - будет оченб хорошо, и
>принимать ф-ция будет массив символов. Можно попробовать извернуться таким образом -
>переделать строку в котором первый символ - длина строки(правда ограничение -
>до 255 символов). Есть еще проблема - надо все время самому
>контролировать этот первый символ и постоянно делать сдвиг.
>
>чтоб было проще делать сдвиг - можно обыграть на указателях =
>
>char *str1 = "bla,bla";
>char *str2 = str1+1;
>пока сам не сталкнулся не воспринимал серьезность различия паскалевски строк и сишных. ну в моем случае монжно попробовать переделать под 2 параметра 1) длина сроки 2) сам массив.
Спасибо за совет
>printf("%s",str2);// output => la,bla
Насколько я знаю, в Паскале string -это обычный char var[255], где var[0] - это длина строки
>Насколько я знаю, в Паскале string -это обычный char var[255], где var[0]
>- это длина строкиВ Delphi (aka Kylix) еще бывают "длинные" строки, в которых длина хранится в первых 4 байтах как значение типа integer.
Слушайте-ка, а вы не думали что даже unix'совые компиляторы паскаля исползуют прямую конвенцию, а не обратную как в С. У каждого из этоих языков компиляторы традиционно работают с передачей параметров именно таким образом. Короче говоря, если библиотеки созданы используя классическую конвенцию паскалевых компиляторов, то передача параметров в их ф-и из С - дохлое напроч дело. Вроде в прототипах ф-и в C нельзя указать спецификатор паскалевой ф-и.
Перепишите все на С, тем более вам это необходимо, раз недавно занялись С'шником.
И ещё: (это также к передеаче параметров) в С\С++ компиляторах опать-же традиционно стек от параметров освобождается после инструкции вызова ф-и, а в паскалевых она делает это сама. В паскале есть вложенные ф-и... хотя это наплевать. Но вот прототип ф-и:
void dlopen();
будет искаться как _dlopen, паскалевый компиллер врядли догадается это предусмотреть(хотя не знаком с unix'овыми комп. паскаля). Вот 100% способ в таком случае:
asm("extern dlopen \n"
pushl %eax \n" //1-й аргумет
pushl %ebx \n" //2-й аргумет
call dlopen \n");//очищать стек от параметров потом не надо
(не знаток AT&T стиля, но по сути так).
Как видно вариант для извращенцев - так что лучше пиши на С\С++.