• 締切済み

Pro*Cのリンクエラーがどうにもならないですっ!!

こんにちわ。 UNIXのC++でPro*Cを使って動的SQLを使ったプログラムを作っています。 プログラムコードは出来上がっていて、単独コンパイルは通るのですが、 実行形式のプログラムを作る時のリンクで「未定義のシンボル」として 以下の4ライブラリ関数がエラーになります。 sqlald()関数、sqlprc()関数、sqlnul()関数、sqlclu()関数 これはおそらく、リンクする際にこれらの関数が含まれているライブラリを リンクできていないだけなのではないかと思っているのですが、 肝心のライブラリがどこのどれなのかがわかりません。 どなたかご存知の方がいらっしゃいましたら、教えてください。 もしかして、プログラム中でもこれらの関数をextern する以外に 何か必要なのでしょうか? PS.教えてgooのプログラミング→C/C++のカテゴリにも質問させていただいて  います。   でもわからないので、誰か助けて~!!という感じです!!

みんなの回答

  • xinman
  • ベストアンサー率30% (25/83)
回答No.1

Pro*C プリコンパイラ・プログラマーズ・ガイド は読まれましたか? もし、読まれていないのであれば、まずは読まれてはいかがでしょうか?

orange_pie
質問者

お礼

もちろん、読破しています。 プログラマーズガイドに乗っていない、おまじないがあったようです。 これについては、別のルートで専門家の方からご指導いただいて 解決しました。 お忙しいところ、アドバイスを下さってありがとうございました。

関連するQ&A

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

    こんにちわ。 UNIXのC++でPro*Cを使って動的SQLを使ったプログラムを作っています。 プログラムコードは出来上がっていて、単独コンパイルは通るのですが、 実行形式のプログラムを作る時のリンクで「未定義のシンボル」として 以下の4ライブラリ関数がエラーになります。 sqlald()関数、sqlprc()関数、sqlnul()関数、sqlclu()関数 これはおそらく、リンクする際にこれらの関数が含まれているライブラリを リンクできていないだけなのではないかと思っているのですが、 肝心のライブラリがどこのどれなのかがわかりません。 どなたかご存知の方がいらっしゃいましたら、教えてください。 もしかして、プログラム中でもこれらの関数をextern する以外に 何か必要なのでしょうか?

  • LNK2001(Pro*c)

    現在、Net8でOracleのデータを参照する、Cの関数を作成しているのですが、 自分で作成したライブラリをリンクして、呼び元をコンパイルすると (Windowsの場合)LNK2001エラーが発生します。 --------------------構成: XXXX - Win32 Debug-------------------- コンパイル中... XXXX.cpp コンパイル中... XXXX.cpp リンク中... XXXX.lib(XXXX.obj) : error LNK2001: 外部シンボル "_sqlcxt" は未解決です Debug/XXXX.exe : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー XXXX.exe - エラー 2、警告 0 -------------------------------------------------------------- となり、UNIXだと、 -------------------------------------------------------------- 未定義の               最初に参照している シンボル               ファイル sqlcxt                XXXX.o ld: 重大なエラー: シンボル参照エラー。XXXX に書き込まれる出力はあ りません。 *** Error code 1 make: Fatal error: Command failed for target `XXXX' -------------------------------------------------------------- となり、sqlcxtを認識出来ていない様です。 ちなみにsqlcxtは、.pcをプリコンパイルすると、.cに吐かれる、 SQLLIBの関数の様です。 Pro*cのライブラリをリンク出来ていないのかと思い、現在いろいろと 調べているのですが、解決できません。 上記では、情報が不足しているかもしれませんが、どなたか御教授下さい。 宜しくお願いします。

  • Unsatisfied code symbol エラーについて

    UNIX上でcのプログラムを作成しています。 OSはHP-UX B.11.23 U ia64 (td)です。 共有ライブラリ(~.sl)を作成したのですが、 これを実行モジュール(a.out)にリンクしてコンパイルして、a.outを実行すると、 エラーになってしまいます。 エラーの内容は、 /usr/lib/hpux64/dld.so: Unsatisfied code symbol 'xxxxx' in load module '/.../...~/a.out'. というもので、ライブラリ内にあるはずのxxxxxをa.outで使用しているのですが、 これが見つからないというエラーのように思えます。 ライブラリ内にはいくつか関数を用意していて、そのほかの関数は普通に使えています。 ライブラリを作成するときにincludeファイルを用意していますが、 その中でexternで関数の宣言をしていて、 xxxxxが他の関数と異なった設定をしているとは思えません。 このような場合、エラーの原因としてどのようなことが考えられるでしょうか? ほとほと困っています…。 どなたか解決方法をご教授願います。 またライブラリに含まれる関数を表示させるUNIXコマンドってありましたでしょうか? もしご存知でしたらあわせて教えていただけると助かります。 何か必要な情報で書き足りないものがありましたら、補足いたしますのでご指摘ください。 よろしくお願いいたします。

  • C言語についてどうしてもわからない疑問

    プログラミング初心者です。 C言語を勉強中に疑問に思ったことが2つあります。 まず1つ目。 C言語以外のプログラミング言語、例えばjavaとかC#とかjsとかpythonとかrubyとかPHPとか、には開発者にとって便利なライブラリとかフレームワーク(僕にはこの2つの明確な違いがわかりません。が、どちらも「開発者が定義しなくてもよい関数やオブジェクトの集合」という認識があります)がありますよね。 そのおかげで色んな人達がプログラミングし易くなりました。 ネット(はてぶのホットエントリとか)でも「馬鹿な俺がプログラミングを勉強して〇〇を作った」といった記事をよく目にします。 でも「C言語を使って」というのは聞いたことがありません。 そもそも、C言語はそいういったライブラリやフレームワークが少ないように感じます。 検索してもrailsとかjqueryのようなフレームワーク(ライブラリ?)は見つかりません。 これが無かったらプログラムなんて作れないのでは? しかし、世間にはC言語で作られたプログラムが多いのもまた事実。 C言語ではいったいどのように開発が行われているのか教えてください。 2つ目 unixとかlinuxといったOSはC言語で書かれている聞いたことがあります。 しかし、プログラムの開発は「コードを書く→コンパイル(→デバッグ)→実行」という流れですよね。 ではOSを開発するときに、そのコードをどうやってコンパイルするのでしょうか? コンパイラはOSの上に立っているとするなら、OSがない状態でコンパイラはどこに立てばいいのか。 そこがわかりません。 誰かこの2つの疑問に答えてください。 お願いします。

  • CLIでのライブラリのリンク方法について

    VS2003のManagedC++では簡単にすることができたネイティブなライブラリを、VS2005のC++/CLIで利用することができません。 VS2003では、ファイルのインクルード、インクルードパスの追加、ライブラリのリンク、ライブラリパスの追加を行うと正しくリンクすることができたライブラリを、同じ方法でリンクしようとすると、VS2005ではコンパイルに失敗します。 ネイティブなライブラリをリンクするので、/clr:pureモードではなく、/clrモードにすればできると思い、試してみたのですが、 error LNK1314: COFF シンボル テーブルが壊れているか、または無効です。未定義のスタティック シンボルまたはラベル シンボルです。 というエラーが起きてコンパイルすることができません。 clrモードのほかに何か設定すべき項目があるのでしょうか。

  • Cコンパイル時のマルチデファイン優先

    Cコンパイル時にincludeファイルの都合上、マルチデファインになってしまいます。 この点はコンパイラが宣言無視をしてくれるのですが、extern優先にしてリンクをするにはどのようにすれば良いのでしょうか。 ファイル内でinclude文(ファイル内)定義より先にextern文でシンボル定義をすれば、extern優先でリンクしてくれるのでしょうか(試して無いのですが)。 コンパラ・リンカ製品の仕様になるのでしょうけれど「マルチデフは絶対ダメ」なコンパイラでない場合、extern宣言を優先にする一般的な方法はありますか 。

  • C言語からC++の関数をコールする方法について

    初めて質問させて頂きます。 質問は2つあります。 ●1つ目の質問です。 この度、C言語ベースのプログラムに、C++で作成した関数を使用することになりました。 方法としてextern等を駆使しつつ、ラッパー関数を使って対応しております。 そこで質問なのですが、この場合、ラッパー関数に使用するファイル形式はcppまたはcのどちらが正しいのでしょうか?(どちらでも動きました) ●2つ目の質問です。 Windows環境(vs2005)では無事、CからC++の関数を呼ぶことに成功はしました。 しかし、本当に動かしたいのはLinuxでの環境になります。 先程作成したラッパー関数のファイルとC++で作成した関数のファイルをライブラリ(soファイル)化したものを使用し、コンパイルとリンクは問題なく通すことに成功したのですが、 実行させてみると、Cの関数からラッパー関数をコールしているのは確実なのですが、ラッパー関数の処理を通らず、プログラムが止まってしまいます。 試しにラッパー関数の処理を「return 0;」だけにして実行させてみましたが現象は変わらずでした。 そのため、ラッパー関数を呼ぶための何かに問題があると思っています。 ここで質問なのですが、ビルドのときにライブラリをリンクさせるだけでは駄目なのでしょうか。また、他に思い当たることがありましたらご教示頂きたいです。 Windows環境(vs2005)では期待する動作をしているためプログラムは問題ないと思っています。

  • SolarisとLinuxのグローバル変数の扱いについて

    Solaris用のソースをLinuxで使えるように変更したいのですが、 グローバル変数について以下のようなことが発生していて困っています。 なにか、コンパイルオプションなどで対応はできないものでしょうか? Solaris (CC)では 特にextern宣言しなくても同じシンボルの外部変数はコモンセグメントに1つだけ作成しコンパイル自体は正常である。 しかし、Linux (g++)では externを宣言しないと同じシンボルを再定義したことになりエラーとなる。 これにより、グローバル変数を多用しているプログラムはLinuxでうまくコンパイルができない。 しかし、単純にextern宣言での対応は難しい。 extern宣言は外部で定義してあるグローバル変数を参照する というものだがLinux では 1つの定義を意外は全てexternしなければ、2重定義エラーになってしまう。 つまり、実体が1つであとはそれを参照しているという形でなければいけない。 ところが、その実体をどこにするか特定することができない。 例えば、gというグローバル変数を仮定する。 A.c,B.c,C.cはその3つのソースよりAA.aという静的ライブラリを構成する。 gはA.cで定義してありB.c,C.cはそれを参照する。 ところが C.cは個別にC.oというオブジェクトで他からの呼び出しがあり 別LMにリンクされる。 その時C.c内のgは実体を失うことになり未定義となる。 つまり、どれが実体になるかは何にリンクするかで決まるため 実態を特定できない。 また、共通のヘッダにグローバル変数が定義されている場合も、重複するというエラーを起こすため、 共通ヘッダからグローバル変数を分離し、何れかのソースにグローバル変数の実態を定義させる必要がある。 共通ヘッダを使っている他のソースはそのグローバル変数の実態を参照するようにexternの宣言をする。

  • Unix上C++でのdllとインポートライブラリの関係

    こんにちわ。 いつも教えてgooにお世話になっているorange_pieです。 UNIX上のC++で作成した自作ライブラリをdllにして配布したいのですが、 Unixでの基本的な考え方を教えてください。 (1)Unix上ではDLLの標準的な名称は”libxxxx.so”とするのが普通ですか?  ※この形式ならLD_LIBRARY_PATH環境変数が検索してくれる。。。 (2)通常、DLLにする場合、インポートライブラリ(.lib)と実際のライブラリ(.so)を作成して、使用する側はインポートライブラリのみをリンクするのでしょうか? (3)配布されたdllを使う側では、Link時にインポートライブラリをリンクして、関連インクルードファイルをインクルードするだけで使えるのでしょうか? (4)上記の(2)のように、インポートライブラリとライブラリの実態を作成する為のコンパイルオプションが見つかりません。(ldのmanを見たのですが、意味がわからないと言うか。。。。。) この質問は、自作ライブラリからlibxxx.soという形のオブジェクトファイルを作り、別プログラムからこのlibxxxをコンパイルオプション(-l)でリンクしてみたら正しく動作したのですが、これでは結局ライブラリの本体が一緒にリンクされている様子で、出来上がった実行形式のファイルサイズが静的ライブラリとしてリンクした時と同じ大きさになっていることに疑問を抱いてしまったものです。  この状態でも、ライブラリの方だけコンパイルしなおして実行すると ちゃんとライブラリの変更点は反映されるので問題は無いのですが、 これでもダイナミックリンク・ライブラリと呼べるのでしょうか?

  • C言語について。

    C言語プログラマとしては、スタートアップコードは・・・ ・自分が書いたプログラムを、直接動かすために必要なライブラリ ・それはコンパイル後、リンカによって追加されるライブラリこれは、 どういう意味でしょうか?分かりやすく教えていただけると幸いです。すみません。で、 以下のかぶくんまんさんの回答です。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11247611941 で、 C言語におけるプログラミングとは「main関数を書くこと」に他ならない。なぜ「main関数を書く」ことがC言語におけるプログラミングに他ならないのかと言えば、それは偏に「C言語のコンパイラはmain関数を呼び出すプログラムを生成するから」です。それがmain関数を求めるので結果的にmain関数がリンクされ、そしてmain関数が求めるままに他の関数もリンクされていくわけです。 で、その「main関数を呼び出すプログラム」こそが、C言語における「スタートアップコード」。 という回答で、main関数以降は、プログラマが書くのですよね?プログラマが関数をリンクさせる様なプログラムを書くということでしょうか?教えていただけると幸いです。すみません。 という所が分かりません。教えていただけると幸いです。すみません。以下のURL https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12247932542