The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Как использовать библиотеки написаные не на С"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Как использовать библиотеки написаные не на С"  
Сообщение от halt (ok) on 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.
Что это значит?

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Как использовать библиотеки написаные не на С"  
Сообщение от chip email(ok) on 30-Янв-06, 13:09 

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

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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

2. "Как использовать библиотеки написаные не на С"  
Сообщение от kir (??) on 30-Янв-06, 15:04 

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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

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

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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

4. "Как использовать библиотеки написаные не на С"  
Сообщение от tilde on 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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

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

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

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

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

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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

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

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


Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

8. "Как использовать библиотеки написаные не на С"  
Сообщение от Niam on 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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

9. "Как использовать библиотеки написаные не на С"  
Сообщение от halt (ok) on 30-Янв-06, 21:20 

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

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

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

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


Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

10. "Как использовать библиотеки написаные не на С"  
Сообщение от Brick (??) on 31-Янв-06, 03:11 
Насколько я знаю, в Паскале string -это обычный char var[255], где var[0] - это длина строки
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

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

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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

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

13. "Как использовать библиотеки написаные не на С"  
Сообщение от landor email(ok) on 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 стиля, но по сути так).
Как видно вариант для извращенцев - так что лучше пиши на С\С++.

    

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру