Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как правильно скомпилировать через gcc
|
|||
|---|---|---|---|
|
#18+
Нужна UDF для InterBase. Написал я свою библиотеку функций mylib.c и откомпилировал gcc. Получил сначала mylib.o затем файл *mylib.so Библиотека получилать рабочая все функции вызываются и т.д. Теперь необходимо добавить функцию uuid_generate(); Добавляю Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. gcc -fPIC -c mylib.c gcc -shared -o mylib.so mylib.o При попытке обратиться к этой фунции выскакивает exception и разрывается связь InterBase c клиентом. Подозреваю, что я неправильно компилирую свою библиотеку, когда пытаюсь пользоваться функциями из других библиотек Линукса. Подскажите как правильно. В Линуксе новичёк. БД из под Win перевожу на Linux. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 09:52 |
|
||
|
Как правильно скомпилировать через gcc
|
|||
|---|---|---|---|
|
#18+
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. gcc -fPIC -c mylib.c gcc -shared -o mylib.so mylib.o При попытке обратиться к этой фунции выскакивает exception и разрывается связь InterBase c клиентом. Подозреваю, что я неправильно компилирую свою библиотеку, когда пытаюсь пользоваться функциями из других библиотек Линукса. Подскажите как правильно. В Линуксе новичёк. БД из под Win перевожу на Linux. В "C" тоже что ли новичек? 1) Еще раз внимательно посмотри на это: Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 2) Декларацию UDF покажи. 3) Ну разницу между CSTRING и VARCHAR знаешь наверное. 4) В данном случае компилить можно одной командой: gcc -shared -o mylib.so mylib.c ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 10:38 |
|
||
|
Как правильно скомпилировать через gcc
|
|||
|---|---|---|---|
|
#18+
Это тут ни причём. Если я закоментирую uuid_generate(uu); то select CreateMyUUID() from rdb$database вернёт www на отлично. Код: plaintext 1. Теперь следующий шаг - как свой библ заставить правильно вызывать функции из другого? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 10:52 |
|
||
|
Как правильно скомпилировать через gcc
|
|||
|---|---|---|---|
|
#18+
Пардонте. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 11:07 |
|
||
|
Как правильно скомпилировать через gcc
|
|||
|---|---|---|---|
|
#18+
Вобщем /opt/interbase/bin/ibserver: relocation error: /opt/interbase/UDF/mylib.so: undefined symbol: uuid_generate остаётся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 11:16 |
|
||
|
Как правильно скомпилировать через gcc
|
|||
|---|---|---|---|
|
#18+
ZmeisheВобщем /opt/interbase/bin/ibserver: relocation error: /opt/interbase/UDF/mylib.so: undefined symbol: uuid_generate остаётся. А в каком месте декларируется функция uuid_generate и где находится ее код? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 12:23 |
|
||
|
Как правильно скомпилировать через gcc
|
|||
|---|---|---|---|
|
#18+
Вообщем разобрался. Спасибо Somebody2 у тебя больше хватило терпенья на меня. Короче. Нашёл в /usr/lib/libuuid.a скопировал её в свой каталог там где mylib.c и выполнил: Код: plaintext 1. Вопрос: А возможно ли, не включать её статически, а заставить Linux связывать их динамически в момент вызова? Или хрен с ней с пусть так работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 12:36 |
|
||
|
Как правильно скомпилировать через gcc
|
|||
|---|---|---|---|
|
#18+
Вопрос снят. Проблемы закончились. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 12:46 |
|
||
|
Как правильно скомпилировать через gcc
|
|||
|---|---|---|---|
|
#18+
ZmeisheВопрос снят. Проблемы закончились. Если не исправишь это, Код: plaintext 1. 2. 3. 4. то со 100%-ной уверенностью можно утверждать: все проблемы у тебя еще впереди ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 12:59 |
|
||
|
Как правильно скомпилировать через gcc
|
|||
|---|---|---|---|
|
#18+
Ладно, щас исправлю. Так пойдёт? static char *c, c_str[64]; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 13:14 |
|
||
|
Как правильно скомпилировать через gcc
|
|||
|---|---|---|---|
|
#18+
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. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 14:05 |
|
||
|
Как правильно скомпилировать через gcc
|
|||
|---|---|---|---|
|
#18+
Тьфу блин. Начсет sizeof я погорячился - надо strncpy(c_str,'www',40-1); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 14:07 |
|
||
|
Как правильно скомпилировать через gcc
|
|||
|---|---|---|---|
|
#18+
Госпыдя, да что ж эта делается!!! 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'; В связи с этим код смотреть бдительно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 14:10 |
|
||
|
Как правильно скомпилировать через gcc
|
|||
|---|---|---|---|
|
#18+
Ну, например, у меня dll под Win уже несколько лет работает без static и в IB без free_it. Гемора из-за этого не было. Для Linux`a это критично или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 14:23 |
|
||
|
Как правильно скомпилировать через gcc
|
|||
|---|---|---|---|
|
#18+
ZmeisheНу, например, у меня dll под Win уже несколько лет работает без static и в IB без free_it. Гемора из-за этого не было. Для Linux`a это критично или нет? Я особо внутренностями не интересовался, знаю тлько что: Если объявлять внутри функции переменную таким образом char c_str[40], то этот массив целиком размещается в стеке, а когда таким static с_str[40], то в сегменте данных. Поэтому в первом случае, когда ты возвратишь c_str, то нет никакой гарантии, что там находятся именно те данные, которые ты туда поместил. Оно может 100 раз нормально сработать, а на 101 будет какой-нибудь сюрприз, вплоть до падения сервера. Во втором случае, я просто не знаю (стыдно конечно), что есть сегмент данных с точки зрения .so и программы ее пользующей. Скорее всего все будет нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 14:36 |
|
||
|
Как правильно скомпилировать через gcc
|
|||
|---|---|---|---|
|
#18+
А что так сложно то? почему не Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 15:56 |
|
||
|
Как правильно скомпилировать через gcc
|
|||
|---|---|---|---|
|
#18+
ХренА что так сложно то? почему не Код: plaintext 1. 2. 3. 4. 5. Во блин. А в самом деле? Хотя наверное это скорее типа теста, а в реальной жизни будут возвращаться разные значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 16:58 |
|
||
|
|

start [/forum/topic.php?fid=25&msg=32791390&tid=1491216]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
58ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 372ms |

| 0 / 0 |
