Пытаюсь собрать библиотеку 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
Решил проблему
добавил
// 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
Решите еще одну, соблюдаете соглашении о наименовании либы - приставка префикс lib, суффикс .so, т.е. libraise.so что позволит традиционным способом через -lraise ее подключать.