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

Исходное сообщение
"проблема с библиотекой"

Отправлено SergSW , 05-Мрт-09 07:00 
Пытаюсь собрать библиотеку UDF под MySQL на Linux, столкнулся со следующей проблемой

//-----raise_lib.cpp
#if (defined(_WIN32) || defined(__WIN32__))
    #include <winsock.h>
#else
    #include <iostream>
    #include <stdlib.h>
#endif

#include <mysql.h>
#include <string.h>

my_bool raise_error_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
{
    unsigned int argStringLength;
    if(args->arg_count==1 && args->arg_type[0]==STRING_RESULT)
    {
        argStringLength = strlen(args->args[0]) + 1;
        memcpy( message
        , args->args[0]
        , argStringLength>MYSQL_ERRMSG_SIZE ? MYSQL_ERRMSG_SIZE : argStringLength );
    } else {
        memcpy( message
        , "Unspecified error raised"
        , 25 );
    }
    return 1;
}

long long raise_error( UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error )
{
    return 0;
}

собираю так:
gcc -Wall -fPIC -I/usr/include/mysql -c ./raise_lib.cpp -o ./linux/raise_lib.o
gcc -lc -Wl,--export-dynamic -shared ./linux/raise_lib.o -O1 -o ./linux/raise_lib.so

Компилируется без ошибок библиотека создаётся, НО при попытке использовать библиотеку не находит функцию raise_error

eu-nm ./raise_lib.so

Symbols from ./raise_lib.so:

Name                                               Value    Class  Type     Size     Line Section
...
_Z11raise_errorP11st_udf_initP11st_udf_argsPcS3_  |000005dc|GLOBAL|FUNC    |       f|    |.text
_Z16raise_error_initP11st_udf_initP11st_udf_argsPc|00000660|GLOBAL|FUNC    |      9c|    |.text

т.е. имена процедур искаверкались как это лечить?

ОС: Debian 5.0
Compiler: gcc 4.3.3


Содержание

Сообщения в этом обсуждении
"проблема с библиотекой"
Отправлено SergSW , 05-Мрт-09 08:33 
Решил проблему
добавил
// raise_lib.h
#include <mysql.h>

extern "C"
{
my_bool raise_error_init(
UDF_INIT *initid
, UDF_ARGS *args
, char *message
);

long long raise_error(
UDF_INIT *initid
, UDF_ARGS *args
, char *is_null
, char *error
);
}

и изменил скрипт компиляции
gcc -Wall -fPIC -I/usr/include/mysql -c ./raise_lib.cpp -o ./linux/raise_lib.o -include ./raise_lib.h
gcc -lc -Wl,--export-dynamic -shared ./linux/raise_lib.o -O1 -o ./linux/raise_lib.so


"проблема с библиотекой"
Отправлено vic , 05-Мрт-09 10:27 
Решите еще одну, соблюдаете соглашении о наименовании либы - приставка префикс lib, суффикс .so, т.е. libraise.so что позволит традиционным способом через -lraise ее подключать.