Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Как правильно скомпилировать через gcc / 17 сообщений из 17, страница 1 из 1
19.11.2004, 09:52
    #32790560
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно скомпилировать через gcc
Нужна UDF для InterBase.

Написал я свою библиотеку функций mylib.c и откомпилировал gcc.
Получил сначала mylib.o затем файл *mylib.so
Библиотека получилать рабочая все функции вызываются и т.д.

Теперь необходимо добавить функцию uuid_generate();
Добавляю

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#include <uuid/uuid.h>

char* CreateMyUUID()
{
  char *c, c_str[ 40 ];
  uuid_t uu;

  uuid_generate(uu);
  ...
  ...
  c = c_str; *c = 'w'; c++; *c = 'w'; c++; *c = 'w'; c++; *c = '\0';
  return c;
}
Компилирую. gcc ни ошибок ни замечаний не выдаёт.

gcc -fPIC -c mylib.c
gcc -shared -o mylib.so mylib.o

При попытке обратиться к этой фунции выскакивает exception и разрывается связь InterBase c клиентом.

Подозреваю, что я неправильно компилирую свою библиотеку, когда пытаюсь пользоваться функциями из других библиотек Линукса.
Подскажите как правильно. В Линуксе новичёк. БД из под Win перевожу на Linux.
...
Рейтинг: 0 / 0
19.11.2004, 10:38
    #32790682
Somebody2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно скомпилировать через gcc
ZmeisheНужна UDF для InterBase.

Написал я свою библиотеку функций mylib.c и откомпилировал gcc.
Получил сначала mylib.o затем файл *mylib.so
Библиотека получилать рабочая все функции вызываются и т.д.

Теперь необходимо добавить функцию uuid_generate();
Добавляю

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#include <uuid/uuid.h>

char* CreateMyUUID()
{
  char *c, c_str[ 40 ];
  uuid_t uu;

  uuid_generate(uu);
  ...
  ...
  c = c_str; *c = 'w'; c++; *c = 'w'; c++; *c = 'w'; c++; *c = '\0';
  return c; 
}
Компилирую. gcc ни ошибок ни замечаний не выдаёт.

gcc -fPIC -c mylib.c
gcc -shared -o mylib.so mylib.o

При попытке обратиться к этой фунции выскакивает exception и разрывается связь InterBase c клиентом.

Подозреваю, что я неправильно компилирую свою библиотеку, когда пытаюсь пользоваться функциями из других библиотек Линукса.
Подскажите как правильно. В Линуксе новичёк. БД из под Win перевожу на Linux.

В "C" тоже что ли новичек?
1) Еще раз внимательно посмотри на это:
Код: plaintext
1.
2.
3.
4.
  char *c, c_str[ 40 ];
  .......
  c = c_str; *c = 'w'; c++; *c = 'w'; c++; *c = 'w'; c++; *c = '\0';
  return c;
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
  а) Возвращается локальная переменная  (с == s_str+3)-  она хранится в стеке и после выхода         
      из процедуры  разрушается  Нужно как мимнимум объявить
       static char c_str[40]  и затем   return c_str . Ну а если ты используешь FREE_IT  
      при декларации UDF, то вообще надо делать что-то типа 

      char *c_str;
      c_str=(char *) malloc(40);
       
  б) У тебя при возврате *c=0 - я так предпологаю это не то, что тебе надо 

2) Декларацию UDF покажи.
3) Ну разницу между CSTRING и VARCHAR знаешь наверное.
4) В данном случае компилить можно одной командой:
gcc -shared -o mylib.so mylib.c
...
Рейтинг: 0 / 0
19.11.2004, 10:52
    #32790717
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно скомпилировать через gcc
Это тут ни причём. Если я закоментирую uuid_generate(uu);
то
select CreateMyUUID() from rdb$database
вернёт www на отлично.

Код: plaintext
1.
 c = c_str; *c = 'w'; c++; *c = 'w'; c++; *c = 'w'; c++; *c = '\0';
  return c;
Это я привёл для того, чтобы показать — библ работающий.
Теперь следующий шаг - как свой библ заставить правильно вызывать функции из другого?
...
Рейтинг: 0 / 0
19.11.2004, 11:07
    #32790753
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно скомпилировать через gcc
Пардонте.
Код: plaintext
1.
2.
c = c_str; *c = 'w'; c++; *c = 'w'; c++; *c = 'w'; c++; *c = '\0';
c = c_str; //  Из исходника эту строчку сюда забыл скопировать
 return c;
...
Рейтинг: 0 / 0
19.11.2004, 11:16
    #32790785
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно скомпилировать через gcc
Вобщем
/opt/interbase/bin/ibserver: relocation error: /opt/interbase/UDF/mylib.so: undefined symbol: uuid_generate
остаётся.
...
Рейтинг: 0 / 0
19.11.2004, 12:23
    #32791004
Somebody2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно скомпилировать через gcc
ZmeisheВобщем
/opt/interbase/bin/ibserver: relocation error: /opt/interbase/UDF/mylib.so: undefined symbol: uuid_generate
остаётся.

А в каком месте декларируется функция uuid_generate и где находится ее код?
...
Рейтинг: 0 / 0
19.11.2004, 12:36
    #32791048
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно скомпилировать через gcc
Вообщем разобрался.
Спасибо Somebody2 у тебя больше хватило терпенья на меня.
Короче. Нашёл в /usr/lib/libuuid.a
скопировал её в свой каталог там где mylib.c
и выполнил:
Код: plaintext
1.
gcc -o mylib.so -shared mylib.c libuuid.a
//Ну типа откомпилировал совместно
По аналогии с Win включил в проект статическую lib для dll.

Вопрос:
А возможно ли, не включать её статически, а заставить Linux связывать их динамически в момент вызова? Или хрен с ней с пусть так работает?
...
Рейтинг: 0 / 0
19.11.2004, 12:46
    #32791090
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно скомпилировать через gcc
Вопрос снят. Проблемы закончились.
...
Рейтинг: 0 / 0
19.11.2004, 12:59
    #32791150
Somebody2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно скомпилировать через gcc
ZmeisheВопрос снят. Проблемы закончились.

Если не исправишь это,

Код: plaintext
1.
2.
3.
4.
 char *c, c_str[ 40 ];
....
 c=c_str;
 return c;

то со 100%-ной уверенностью можно утверждать:

все проблемы у тебя еще впереди
...
Рейтинг: 0 / 0
19.11.2004, 13:14
    #32791204
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно скомпилировать через gcc
Ладно, щас исправлю.
Так пойдёт?
static char *c, c_str[64];
...
Рейтинг: 0 / 0
19.11.2004, 14:05
    #32791390
Somebody2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно скомпилировать через gcc
ZmeisheЛадно, щас исправлю.
Так пойдёт?
static char *c, c_str[64];
В простой функции однозначно пойдет, а насчет UDF не знаю. Я б предпочел
выделять память под c_str динамически и в декларации функции указывать
Free_it:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
char* CreateMyUUID()
{
  char * c_str;
  uuid_t uu;

  c_str=(char *) malloc( 40 );
  uuid_generate(uu);
  ...
  ...
//  c = c_str; *c = 'w'; c++; *c = 'w'; c++; *c = 'w'; c++; *c = '\0';
   strncpy(c_str,"WWW",sizeof(c_str)- 1 );
// или c_str[ 0 ] = c_str[ 1 ] =c_str[ 2 ] = 'w';c_str[ 0 ] = '\0';
  return c_str;
}

Код: plaintext
1.
2.
3.
...
returns cstring( 39 ) free_it
...
...
Рейтинг: 0 / 0
19.11.2004, 14:07
    #32791401
Somebody2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно скомпилировать через gcc
Тьфу блин. Начсет sizeof я погорячился - надо
strncpy(c_str,'www',40-1);
...
Рейтинг: 0 / 0
19.11.2004, 14:10
    #32791409
Somebody2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно скомпилировать через gcc
Госпыдя, да что ж эта делается!!!

c_str[0] = c_str[1] =c_str[2] = 'w';c_str[0] = '\0';

надо
c_str[0] = c_str[1] =c_str[2] = 'w';c_str[3] = '\0';

В связи с этим код смотреть бдительно!
...
Рейтинг: 0 / 0
19.11.2004, 14:23
    #32791453
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно скомпилировать через gcc
Ну, например, у меня dll под Win уже несколько лет работает
без static и в IB без free_it. Гемора из-за этого не было.

Для Linux`a это критично или нет?
...
Рейтинг: 0 / 0
19.11.2004, 14:36
    #32791503
Somebody2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно скомпилировать через gcc
ZmeisheНу, например, у меня dll под Win уже несколько лет работает
без static и в IB без free_it. Гемора из-за этого не было.

Для Linux`a это критично или нет?

Я особо внутренностями не интересовался, знаю тлько что:
Если объявлять внутри функции переменную таким образом
char c_str[40],

то этот массив целиком размещается в стеке, а когда таким

static с_str[40],

то в сегменте данных.

Поэтому в первом случае, когда ты возвратишь c_str, то нет никакой гарантии,
что там находятся именно те данные, которые ты туда поместил. Оно может 100
раз нормально сработать, а на 101 будет какой-нибудь сюрприз, вплоть до
падения сервера.

Во втором случае, я просто не знаю (стыдно конечно), что есть сегмент данных
с точки зрения .so и программы ее пользующей. Скорее всего все будет
нормально.
...
Рейтинг: 0 / 0
19.11.2004, 15:56
    #32791835
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно скомпилировать через gcc
А что так сложно то?

почему не

Код: plaintext
1.
2.
3.
4.
5.
char* CreateMyUUID()
{
  ...............
  return "www";
}
...
Рейтинг: 0 / 0
19.11.2004, 16:58
    #32792026
Somebody2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно скомпилировать через gcc
ХренА что так сложно то?

почему не

Код: plaintext
1.
2.
3.
4.
5.
char* CreateMyUUID()
{
  ...............
  return "www";
}


Во блин. А в самом деле?

Хотя наверное это скорее типа теста, а в реальной жизни будут возвращаться разные значения.
...
Рейтинг: 0 / 0
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Как правильно скомпилировать через gcc / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]