[前][次][番号順一覧][スレッド一覧]

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]