OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

Pro*Cで動的SQLを実現する為のライブラリ関数はどのファイルに入っているのでしょうか?

  • すぐに回答を!
  • 質問No.145056
  • 閲覧数1093
  • ありがとう数1
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 87% (34/39)

こんにちわ。
UNIXのC++でPro*Cを使って動的SQLを使ったプログラムを作っています。
プログラムコードは出来上がっていて、単独コンパイルは通るのですが、
実行形式のプログラムを作る時のリンクで「未定義のシンボル」として
以下の4ライブラリ関数がエラーになります。

sqlald()関数、sqlprc()関数、sqlnul()関数、sqlclu()関数

これはおそらく、リンクする際にこれらの関数が含まれているライブラリを
リンクできていないだけなのではないかと思っているのですが、
肝心のライブラリがどこのどれなのかがわかりません。
どなたかご存知の方がいらっしゃいましたら、教えてください。

もしかして、プログラム中でもこれらの関数をextern する以外に
何か必要なのでしょうか?
通報する
  • 回答数1
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.1
レベル14

ベストアンサー率 50% (1122/2211)

> もしかして、プログラム中でもこれらの関数をextern する以外に
> 何か必要なのでしょうか?

という文から察するに、あなたのプログラムには

extern int sqlald();

なんて行を書いているのですね?

これが悪いんです。C++ は、関数のオーバロードができますから、引数の個数や
型が違えば、違った関数とみなされます。

きちんと、Pro*C で用意されているインクルードファイルをインクルードして、
自前のプロトタイプ宣言は削除して下さい。

# 私は、一応計算機屋さんなのですが、Pro*C 未経験なので自信無しです。
お礼コメント
orange_pie

お礼率 87% (34/39)

すばらしいです!!
さすがです!!
こちらでも、同時進行でわが社のプロフェッサーさんから
アドバイスを受けて原因がわかりかけていたところに、くまさんからの
お返事を拝見させていただきました。

御察しのとおり、extern int sqlald();を記述していました。
手元にPro*Cプログラマーズ・ガイドがあり、それを手本にしてきたのですが、これはそもそも標準C言語から使用する場合のことが載っていたのでした。

やはり、プロフェッサーさんからも問題のexternの部分を指摘されていて、
これらのextern文全てを
#extern "C" {
}
で囲むことを教わりました。これでコンパイルもリンクも通ってプログラムも動くようになりました。

が、くまさんのアドバイスを見たところ、
>きちんと、Pro*C で用意されているインクルードファイルをインクルードして、
>自前のプロトタイプ宣言は削除して下さい。
と書かれていたので早速、grepを使って定義されているインクルードファイルを探してみました。

そしたら、sqlcpr.hというファイルが見つかり、さらにその中で先ほどの
#extern "C" {
}
が使われていました。さらに、この定義を生かす為に、
#ifdef __cplusplus で囲われていたので、コンパイルオプションに
「-D__cplusplus」を追加してみました。

そしたら、自作のextern文を削除してもうまく動くようになりました。
本当に、すばらしいです!!
ありがとうございました。
ポイント30くらいあげたいところですが、あげられないようなので20ポイント!!です。
投稿日時 - 2001-10-03 16:15:39
-PR-
-PR-
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ