2012-03-13 11 views
3

MySQL (MySQL에서 실행 가능한 C 함수) 용 UDF 함수를 만들려고하는데 왼쪽 및 오른쪽 문제가 있습니다. 나는 곧바로 코드를 작성하려고한다. (즉, 관련이있는 경우, 표준 = C99에 대해 아치 = i386을 위해)MySQL에서 UDF 함수를 만드는 중 오류가 발생했습니다.

my_bool  sql_levenshtein_init(UDF_INIT *initid, UDF_ARGS *args, char *message); 
void  sql_levenshtein_deinit(UDF_INIT *initid); 
longlong sql_levenshtein(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error); 

내가 파일을 컴파일 : 나는 다음과 같은 선언 및 해당 구현을 포함하는 파일 levenshtein.c 있습니다. 내가 만든 .so 파일을 내 mysql 플러그인 폴더에 복사한다. 나는이 문제를 해결하기 위해 노력에서이 오류

ERROR 1127 (HY000): Can't find symbol 'sql_levenshtein' in library 

을 받고, MySQL을로 가서 대신에이 명령의

mysql> create function sql_levenshtein returns int soname 'levenshtein.so'; 

성공적으로 함수를 만드는 명령을 실행, 나는 많이 들고 오지 않았다 유용한 정보. 인터넷 검색 후, 나는 nm 명령을 사용하여 .so 파일을 확인했습니다. 그리고이 출력을 가지고 :

00001600 t ___inline_memset_chk 
00001870 t ___inline_strcpy_chk 
     U ___memset_chk 
     U ___stack_chk_fail 
     U ___stack_chk_guard 
     U ___strcpy_chk 
00001220 T _cell_value 
     U _free 
00001180 T _is_levenshtein_within_normthresh 
00001100 T _is_levenshtein_within_thresh 
00001460 T _levenshtein 
00000cf0 T _levenshtein_k 
     U _malloc 
00001400 t _minimum 
00001660 T _normlevenshtein 
000018f0 T _sql_levenshtein 
000018c0 T _sql_levenshtein_deinit 
00001710 T _sql_levenshtein_init 
00001df0 T _sql_levenshtein_within_normthreshold 
00001dd0 T _sql_levenshtein_within_normthreshold_deinit 
00001d00 T _sql_levenshtein_within_normthreshold_init 
00001c00 T _sql_normlevenshtein 
00001be0 T _sql_normlevenshtein_deinit 
00001b20 T _sql_normlevenshtein_init 
     U dyld_stub_binder 

_sql_levenshtein를, 그래서 함수가 존재하는 것처럼 보인다. 그 밖의 무엇이 도움이 될지 확신 할 수 없습니다. 귀하의 안내에 감사드립니다! 응답

커트

========= 업데이트는 언급합니다 : 글쎄, 그것은 가치가 무엇을, 나는 또한

mysql> create function _sql_levenshtein returns int soname 'levenshtein.so'; 
ERROR 1127 (HY000): Can't find symbol '_sql_levenshtein' in library 

를했다 그래서이 아닌 것 같아 그것이 문제의 근본 원인입니다. 어쩌면 내가 뭔가를 놓친 것 같아.

+0

'sql_levenshtein'과'_sql_levenshtein'은 같은 기호가 아닙니다. –

+0

응답하도록 응답합니다. –

+0

.so 파일을 올바른 위치에 정확하게 넣으시겠습니까? 어디 있니? –

답변

1

답을 찾았는지 모르겠지만 MySQL에서 함수를 만들 때 정의한 함수의 이름을 사용해야합니다.)는 "my_func_udf"라는 UDF를 가지고 코드에서 당신이 My_Func (라는 게있어 경우에 따라서, 귀하의 경우에 당신이 그것을 전화 :

longlong sql_levenshtein(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error); 

이 모든 마법이 일어나는 장소 인을, 당신은에 있습니다 CREATE FUNCTION My_Func RETURNS (STRING, INTEGER, REAL) SONAME "당신의 파일 이름"과 같은 create 문에서이 함수의 이름을 사용하십시오. 당신이 뭔가를 정의해야하고 다른 뭔가를 호출

CREATE FUNCTION sql_levenshtein RETURNS INTEGER SONAME "levenshtein.so"; 

, 이것이 당신의 실수 : 코드에서

위의 예는 말했다.

관련 문제