mysql:3497
From: Kengo Jinno <Kengo Jinno <kengo@xxxxxxxxxx>>
Date: Fri, 06 Apr 2001 13:13:04 +0900
Subject: [mysql 03497] Re: 日本語版での開発について
神野です。 Fri, 6 Apr 2001 11:04:55 +0900 ごろに <001101c0be3d$f9806e40$2501a8c0@jshome> の "[mysql 03496] 日本語版での開発について" のメールで "hirofujita8523" <hirofujita8523@xxxxxxxxxx> さんは書きました。 Borland C++ 5.5.1でコンパイルだけしてみました。 > A.winclients-3.23.09a-sjis.zip(SJIS) > A.コンパイルできない。 > Error: Unresolved external '_mysql_num_fields' referenced from module > test.cpp 「リンクに失敗する」ですよね。 mysql.hを見ると、mysql_num_fields()はSTDCALL宣言されていないので、 C呼び出し(__cdecl)です。 test.cppで使っている他の関数は、Pascal呼び出し(__stdcall)です。 コンパイラは、外部関数の名前を、 C呼び出し 下線を付ける Pascal呼び出し 下線を付けない と修飾するようです。 ライブラリは > implib -c libmySQL.lib libmySQL.dll で作成されている(-aが無い)ので、下線なしの名前になっています。 そのため、C呼び出しのmysql_num_fieldsだけ、リンクに失敗します。 bcc32 -ps test.cpp libmysql.lib で、全部Pascal呼び出しにしてやれば、コンパイル・リンクは通ります。 しかし、mysql_num_fields()がC呼び出しで実装されている(少なくとも mysql.hはそう言っている)とすれば、正常に動作しないでしょう。 implib -c -a libmySQL.lib libmySQL.dll で(下線付きで)ライブラリを作成し、 #include <windows.h> #include <stdio.h> #define NO_CLIENT_LONG_LONG #include "mysql.h" #ifdef __cplusplus extern "C" { #endif MYSQL * STDCALL _mysql_init(MYSQL *mysql); MYSQL * STDCALL _mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int clientflag); int STDCALL _mysql_select_db(MYSQL *mysql, const char *db); int STDCALL _mysql_query(MYSQL *mysql, const char *q); MYSQL_RES * STDCALL _mysql_store_result(MYSQL *mysql); void STDCALL _mysql_free_result(MYSQL_RES *result); void STDCALL _mysql_close(MYSQL *sock); #ifdef __cplusplus } #endif int main() { MYSQL *p = _mysql_init(NULL); p = _mysql_real_connect(p, NULL, NULL, NULL, NULL, 0, NULL, 0); ... MYSQL_RES *res = _mysql_store_result(p); printf("%d", mysql_num_fields(res)); ... } のように、STDCALLの関数を下線付きで宣言しなおして使えば、 コンパイル・リンクは通ります。 #mysql_num_fields()はSTDCALLではないのでそのまま。 これなら(mysql.hが言う)呼び出し規約にも反しません。 が、使うのは面倒かもしれませんね。 #pragmaかなんかをうまく使ってやれば、「mysql.hで宣言している STDCALL関数は、下線なし」という風に指定できるかもしれません。 それができれば一番簡単だと思います。 > B.winclients-3_22_28_sjis.zip(SJIS) > B.コンパイルはできるが、mysql_num_fields() で、0 が返ってくる。 このmysql.hでは、 #define mysql_num_fields(res) (res)->field_count と定義されています。 #古いmysql_num_fields()の形式です。 たぶん、サーバーがこれよりも新しく、 ・フィールド数は他の方法で返す。 ・MYSQL_RES::field_countにゼロが入っている。 という実装になっているのではないかと思います。 #ソースと挙動から推測しただけです。 -- 神野健吾 <kengo@xxxxxxxxxx>
3496 2001-04-06 11:04 ["hirofujita8523" <hi] 日本語版での開発について -> 3497 2001-04-06 13:13 ┗[Kengo Jinno <kengo@x] 3506 2001-04-06 19:31 ┗["hirofujita8523" <hi] 3507 2001-04-06 20:08 ┗[Kengo Jinno <kengo@x] 3509 2001-04-07 06:15 ┗["hirofujita8523" <hi]