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

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

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

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

このQ&Aに関連する最新のQ&A

A 回答 (1件)

> もしかして、プログラム中でもこれらの関数をextern する以外に


> 何か必要なのでしょうか?

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

extern int sqlald();

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

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

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

# 私は、一応計算機屋さんなのですが、Pro*C 未経験なので自信無しです。
    • good
    • 0
この回答へのお礼

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

御察しのとおり、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

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qraiingとrainについて

雨が降っていた、だとIt is raiingですよね。
だとしたら、rainyを使えば It is fineみたいに
It is rainyってかけるんですか?

もし、かけたとした場合、どうして前者の例題ばかり
本にのっているんでしょう。
そのほうが一般的に使用するからですか?

あと、どうしてIt is get darkとこの文だけgetを
中にいれるんですか??

回答おねがいします☆

Aベストアンサー

>雨が降っていた、だとIt is raiingですよね。

「雨が降っている。」なら、次の(1)のようです。
(1)It is raining.

>だとしたら、rainyを使えば It is fineみたいに
It is rainyってかけるんですか?

(2)It is rainy.
と書けます。

「雨が降っている」という意味を表す場合、(1)と(2)の違いは次のようです。

(1)は、今正に、雨粒が目の前を落下していて、地面や水面に落ちているという感じがします。今の瞬間に雨粒が落下している場合以外は用いません。
次のように用います。
(ア)It's raining hard.(強く降っているね。)
(イ)A: Is it raining now?(今降ってる?)
A: Yes. It's raining.(うん。降ってるよ。)

(2)は、「雨降りだ」「雨だ」という感じがします。つまり、雨粒が落下しているという感じは(1)ほど強くなく、今の瞬間には雨粒は落下してなくても、雨天だと思えば用います。
(ア)A: How's outside?(外はどう?)
B: It's rainy.(雨だよ。)
Bは、その瞬間に雨粒が落下してなくても雨天だと思えばこのように言います。

(2)は、上記以外に、次の(3)~(5)などの意味も表します。(1)は、このような意味は表しません。
(3)雨期です。
(4)雨がちです。
(5)雨模様です。

>どうしてIt is get darkとこの文だけgetを
中にいれるんですか??

上記の文は、文法的に間違いです。可能性としては、次の(6)を上記のように勘違いされたのではないでしょうか。
(6)It's gotten dark.(もう暗くなった。)
この場合のit'sは、it hasの意味です。

>雨が降っていた、だとIt is raiingですよね。

「雨が降っている。」なら、次の(1)のようです。
(1)It is raining.

>だとしたら、rainyを使えば It is fineみたいに
It is rainyってかけるんですか?

(2)It is rainy.
と書けます。

「雨が降っている」という意味を表す場合、(1)と(2)の違いは次のようです。

(1)は、今正に、雨粒が目の前を落下していて、地面や水面に落ちているという感じがします。今の瞬間に雨粒が落下している場合以外は用いません。
次のように用います。
(ア)It's raini...続きを読む

Q関数の戻り値がextern

C言語を、他人のプログラム例を見ながら勉強を始めた者です。

----- abc.h -----
extern char aaa(); (1)
extern char bbb(); (2)

----- abc.c -----
char aaa()
{
char sw;
(3)
}

char bbb()
{
char sw;
return sw; (4)
}
Q1.
(1)(2)は戻り値が外部変数ということでよいのでしょうか?
YESとすれば(4)で自動変数のswが戻り値になっているのは何故でしょうか?
Q2.
(3)のbbb()では戻り値がvoidではないのに
return文がないのは何故でしょうか?
初心者なので質問自体が変だったらスミマセン。

Aベストアンサー

A.1 違います。
「『char aaa()』という関数が外部で定義されている」という意味です。

例えば、
bbb.c
----
#include "abc.h"

void ccc(){
aaa();
}
----
として、 cc abc.c bbb.c などとコンパイルすれば、 abc.cで定義された関数をbbb.cで使うことができます。
この仕組みは、知らないうちに普段から使っています。
例えば、printfですが、正確にはC言語でなく、「標準ライブラリ」という、既のコンパイル済みのプログラムを利用しているものです。printfが使えることを知らせるために、stdio.h の中には extern printf( .. というような記述があります(実際には、そこからさらに#includeされたファイルに記述されていたり、前後に他の記述が付いていることもありますが)
詳細は「分割コンパイル」で検索するとよいでしょう。

A.2
・単なる間違い
・void型の無い処理系、なかったころの古いソースコード
・もとの作者がvoid型を知らない

あたりが考えられます。
エラーではありませんし、void関数として利用してもとりあえずは動作します。
が、最近の一般的なコンパイラでは警告が出るはずです。
なにかを返すのが正しいのか、voidにするのが正しいのかは仕様書やソースコードから判断してください。

A.1 違います。
「『char aaa()』という関数が外部で定義されている」という意味です。

例えば、
bbb.c
----
#include "abc.h"

void ccc(){
aaa();
}
----
として、 cc abc.c bbb.c などとコンパイルすれば、 abc.cで定義された関数をbbb.cで使うことができます。
この仕組みは、知らないうちに普段から使っています。
例えば、printfですが、正確にはC言語でなく、「標準ライブラリ」という、既のコンパイル済みのプログラムを利用しているものです。printfが使えることを知らせるために、stdio.h の中には ...続きを読む

QiPad Airの購入について

母がiPad Airの購入を考えています。パソコンはあるので、ちょっとしたネットサーフィン程度に使うだけです。
iPad AirとiPad Air2のスペックを見比べて、「ちょっとしか使わないからスペックは気にしない」と母が言うので、iPad Airの方にしようと考えています。
価格比較サイトなどではiPad Airが販売されている店舗が表示されますが、先程アップルの公式サイトを見に行くとiPad Air2しか表示されていませんでした。
iPad Airの製造・販売はもう終了してしまったんでしょうか?

Aベストアンサー

初代iPad Airは終息しています。
iPad Air2も、事実上の後継機である9.7型iPad Proが登場しているので、終わりかけています。
https://ja.wikipedia.org/wiki/IPad#iPad.E3.83.A2.E3.83.87.E3.83.AB.E3.81.AE.E5.A4.89.E9.81.B7

Qスタティックリンクライブラリで2重リンクできる?

スタティックリンクライブラリで2重リンクをしようとすると、warning LNK4006が発生してしまいます。

メッセージ:
"~で定義されています; 2 つ目以降の定義は無視されます"

例えば、
aaa.libがbbb.libとccc.libをリンクしてて、bbb.libとccc.libはそれぞれddd.libをリンクしているとします。*.libはすべてスタティックリンクライブラリで提供を考えています。

  [ aaa.lib ]
   |   |
[bbb.lib] [ccc.lib]
  |     |
[ddd.lib] [ddd.lib]


調べてみると「ライブラリーを結合する時に,このエラー・メッセージが表示された場合,ライブラリーに既に存在しているシンボルを追加しようとしています。」ということで、要は"ddd.lib"が重複してリンクされているという事のようなのですが、原因ばかりで解決策が分かりません。

LNK4006の解決法が分かれば良いのですが、最終的にはこの構成で"aaa.lib"だけで提供するようなライブラリを作成したいです。実現するためにはどのようにしたら良いのでしょうか?アイデアを頂けたら助かります。また詳しい方がいらっしゃいましたらご教授お願いいたします!

※Windows2000でVisualStadio.NET2003を使用してます。

スタティックリンクライブラリで2重リンクをしようとすると、warning LNK4006が発生してしまいます。

メッセージ:
"~で定義されています; 2 つ目以降の定義は無視されます"

例えば、
aaa.libがbbb.libとccc.libをリンクしてて、bbb.libとccc.libはそれぞれddd.libをリンクしているとします。*.libはすべてスタティックリンクライブラリで提供を考えています。

  [ aaa.lib ]
   |   |
[bbb.lib] [ccc.lib]
  |     |
[ddd.lib] [ddd.lib]


調べてみると「ライブラリーを結...続きを読む

Aベストアンサー

> でもスタティックだとそうしなくとも良いのですね。

DLLというのはある種完結してますので、ビルド時に不明なシンボルがあるとエラーになります。

一方、スタティックなライブラリはただのobjファイルのアーカイブです。
不明なシンボルがあっても関知せずにビルド成功します。
実際にそのライブラリをリンクして実行ファイルを作る際に、初めてシンボルが解決できればよいのです。

で、以下は状況が断定しかねるの憶測交じりになりますが、かなりDLLの感覚に引っ張られていませんか。

もしかして、bbb.libやccc.libにそれぞれddd.libを指定していませんか。
最終的にaaa.libひとつで公開したいのならそのリンクは不要というか余計です。はずしてください。

スタティックライブラリ内の.objは、VC付属のlib.exe(ライブラリアン)等で確認できまます。
一覧表示などしてみてください。

言ってしまえば今回の場合、これを確認しながら、最終的にすべての.objがひとつだけリンクされるように
各ライブラリを組み合わせてあげれば、aaa.libの完成です。

スタティックリンクする場合、中間のライブラリには依存するライブラリをリンクする必要がありません。
「静的にリンクする」ということはそのライブラリ内のobjを取り込んでしまうということです。
bbb.libやccc.libにddd.libを静的リンクしてしまうと、それぞれにddd.lib内の.objが含まれてしまいますので、
aaa.lib作成の際にそれらが警告を出すでしょう。

普通、スタティックなライブラリ同士をリンクすることも稀だと思います。
# 今回のように、配布用などにまとめたいときくらい?

aaa.libだけを公開したいのであれば、bbb.libやccc.libにddd.libをリンクする必要はありません。
(DLLのように依存関係のライブラリをリンクする意味はありません)
ということで、bbb.lib、ccc.lib、ddd.libを個別に作成し、aaa.libに直接、ひとつずつリンクしてください。

> でもスタティックだとそうしなくとも良いのですね。

DLLというのはある種完結してますので、ビルド時に不明なシンボルがあるとエラーになります。

一方、スタティックなライブラリはただのobjファイルのアーカイブです。
不明なシンボルがあっても関知せずにビルド成功します。
実際にそのライブラリをリンクして実行ファイルを作る際に、初めてシンボルが解決できればよいのです。

で、以下は状況が断定しかねるの憶測交じりになりますが、かなりDLLの感覚に引っ張られていませんか。

もしかして...続きを読む

QAIRを使ってブラウザ上でWEBサイトを表示したい、

AIRを使ってブラウザ上でWEBサイトを表示したい、
と考えています。

お世話になります。AIRに興味を持ち始めた者です。

AIRをデスクトップアプリケーションとしてではなく、
ブラウザ上のFlash Playerで動かしたいと考えています。

ASでは出来ないこと(WEBサイトを表示したい)をしたいため、
ASではなくAIRを考えています。

AIRでは、mx:HTMLやHTMLControll、HTMLLoaderなどを使うと、
WEBサイトを表示できることは分かりました。

下記のサイトで、AIRのアプリをブラウザ上で動かしているようです。
http://www.atmarkit.co.jp/fwcr/rensai2/airwidget01/airwidget01_1.html

今回のサンプルAIRウィジェットをFlexアプリにしたもの で検索して見つかる部分です。

このアプリは、ASでも十分出来ることだから
ブラウザ上で動かすことが出来ているのでしょうか?

それともAIRのアプリなら、どれでも(たとえばWEBサイトを表示するものでも)
ブラウザ上で動かせるのでしょうか?

もし可能なら、ブラウザへの組み込み方法(パブリッシュ方法やHTMLタグなど)も
合わせて、ご教授いただけると幸いです。

AIRを使ってブラウザ上でWEBサイトを表示したい、
と考えています。

お世話になります。AIRに興味を持ち始めた者です。

AIRをデスクトップアプリケーションとしてではなく、
ブラウザ上のFlash Playerで動かしたいと考えています。

ASでは出来ないこと(WEBサイトを表示したい)をしたいため、
ASではなくAIRを考えています。

AIRでは、mx:HTMLやHTMLControll、HTMLLoaderなどを使うと、
WEBサイトを表示できることは分かりました。

下記のサイトで、AIRのアプリをブラウザ上で動かしているようです。
http:/...続きを読む

Aベストアンサー

AIRはたしかにFlexもJavaScriptも扱えますが、現状ではAIR APIはブラウザ上では動かないんじゃないでしょうか。
Flex or JavaScript → AIRはほぼ100%いけると思いますが、AIR → ブラウザはAIR APIを使用しない範疇で書かれているもののみ動作するということになると思います。
ですが、わざわざAIRを使って開発するのにAIR APIを使わないのではメリットはほぼ無いようなものなので、AIR → ブラウザにできるようなものは少ないはずです。

Qライブラリ関数と同名のメンバ関数

たとえば、以下のように fclose という
メンバ関数を定義し、このクラスの実装のなかで
標準ライブラリ関数 fclose を呼びたいときには
どうすれば良いのでしょうか。
別の名前にするというのは無しでお願いします。

#include <stdio.h>
class MyFile {
public:
int fclose(FILE* fp);
};
int MyFile::fclose(FILE* fp)
{
printf("閉じました\n");
fclose(fp); // 標準ライブラリ関数のfcloseを呼びたい
return 0;
}
main()
{
FILE *fp=NULL;
MyFile f;
f.fclose(fp);
return 0;
}

Aベストアンサー

#include <stdio.h>
class MyFile {
public:
int fclose(FILE* fp);
FILE *open(char *fname,char *mode);
char *fgets(char *buf, int size, FILE *fp);
};
int MyFile::fclose(FILE* fp)
{
printf("閉じました\n");
::fclose(fp); // 標準ライブラリ関数のfcloseを呼びたい
return 0;
}
FILE* MyFile::open(char *fname,char *mode)
{
FILE *fp;
printf("開きました\n");
fp = ::fopen(fname,mode); // 標準ライブラリ関数のfopenを呼びたい
return fp;
}
char * MyFile::fgets(char *buf, int size, FILE *fp)
{
return (::fgets(buf,size,fp));
}
main()
{
FILE *fp;
char buf[BUFSIZ];
MyFile f;

fp = f.open("test.txt","r");
while(f.fgets(buf,BUFSIZ,fp) != NULL) {
printf(buf);
}
f.fclose(fp);
return 0;
}

#include <stdio.h>
class MyFile {
public:
int fclose(FILE* fp);
FILE *open(char *fname,char *mode);
char *fgets(char *buf, int size, FILE *fp);
};
int MyFile::fclose(FILE* fp)
{
printf("閉じました\n");
::fclose(fp); // 標準ライブラリ関数のfcloseを呼びたい
return 0;
}
FILE* MyFile::open(char *fname,char *mode)
{
FILE *fp;
printf("開きました\n");
fp = ::fo...続きを読む

Qin the airのthe

in the airのtheは文法的にいうと何用法なのでしょうか?

in airというのはほとんど聞かないと思います。 in the airなのでしょうね。

Aベストアンサー

in the air が普通に使われ、主に『空中に』の意で、またイディオムに使われるのもこちらです。in airが使われない、ということはなくこちらはもっぱら物質?としての『空気の中に』の意味で使われことが多いと思います。

このtheは慣用的につける、つけない、かだけこことだと思います。

Qc言語のプログラムで平均点に一番近い点数表示するには関数を使わないプログラムでは表示できますか?

c言語のプログラムで平均点に一番近い点数表示するには関数を使わないプログラムでは表示できますか?

Aベストアンサー

関数を使わないと何もできない.

Qwith a fresh air supply.はどうして正しいのでしょうか?

ある長文に出てきた一部。
with a fresh air supply.はどうして正しいのでしょうか?
a fresh air is supply.は成立するのでしょうか?
with a fresh air supplying.が正しいのではないのでしょうか?

Aベストアンサー

fresh air supply:これ全部で新鮮な空気を供給する装置と受け止めてください
だから冠詞がついているのです

Qライブラリにない関数の定義

誤差関数erfと相補誤差関数erfc がライブラリになく
プログラムが組めなくて困っています。
どこかにソースがうpされているとか関数のソースを持っている方とかヘッダファイルを提供してくださる方、お願いします。

Aベストアンサー

「C言語による最新アルゴリズム事典」
(ISBN4-87408-414-1)
のpp227-230にigamma.cとしてソースがあります。
サポートページからソースはダウンロードできますが、
この手のアルゴリズム本はプログラマには必須です。

TO 運営スタッフの方
この本に「プログラムは自由にお使いいただいてかまわない」
とあるので、ここに紹介しました。
問題があれば削除してください。

参考URL:http://oku.edu.mie-u.ac.jp/~okumura/algo/


人気Q&Aランキング

おすすめ情報