アプリ版:「スタンプのみでお礼する」機能のリリースについて

Cプログラムでのデータベース接続が出来ない事で質問です。

現在C言語で書いたプログラムがありまして、今まではwindows上でCSVファイルから読み込んで、
新しいファイルに書き込むというような内容のプログラム作っていました。

それを今は

OSをLINUXのRedhat(teratermからアクセス)
読み込むデータファイルをデータベース(Postgresql)

にしてやっています。

何とかDBをインストールして、DBにCSVファイルをコピーした物を作る所までは出来ました。

その後CプログラムでDBを利用する時、色んな設定をしてやらなくてはいけないと思うのですが
まずlibpq-fe.hというものをincludeして使うとは分かったのですが、これがまず見つかりません。

質問(1)
OSの中のファイルを探す時にコマンドで# find ~ -name libpq-fe.hとやったのですが間違っていますか?
ちなみにあるとしたらどこにそのヘッダーファイルはありますか?

質問(2)
インストールした手順としては日本PostgreSQLユーザ会のサイトからソースをダウンロードしてコンパイル、インストールを行いましたが、調べるとrpmと言うものを使ってインストールした人が同じような内容で質問していて、develを入れないとヘッダーファイルが
入らないという記述がありました。

その事は何か関係がありますか?

質問(3)
libpq-fe.hが必要と書きましたが、他にもlibpq.soやlibpq.hと書いてあったりしてそこの所もよく分かりません。


記述が足りなかったらすいません。
ヒントでも良いので宜しくお願いします。

A 回答 (3件)

> ヘッダファイルが見つからないのは探す場所が違うんだろうな、何でだろうな…とか。


ヘッダなりライブラリなりの置き場所には慣例的な決まりがありまして、

/usr/include
/usr/lib

などになります。
黙っていても探してくれるのはそれらのディレクトリだけなので、ほかの場所に置いてあっても探してくれません。ということで別途教えてやる必要があります。

-I ヘッダファイル探索ディレクトリ
-L ライブラリファイル探索ディレクトリ
-l 使うライブラリの名前 libXXX

gcc -I/usr/local/pgsql/include -L/usr/local/pgsql/lib -lpq -o sample sample.c

こんな感じになります。
また、コンパイル&リンクはこれでできますが、そのままだと実行する時に sample が libpq.so の位置を知らないのでエラーになります。これは環境変数で指定できます。

export LD_LIBRARY_PATH=/usr/local/pgsql/lib

この環境変数は設定した以後に起動される「全ての」プログラムに対して影響するので、不毛なトラブルの原因になる場合がありますから注意してください。

> ソースからとパッケージからのインストール何が違うのかとか。

RPM インストール
rpm コマンド一発で全部勝手にやってくれます。そのお手軽さがウリです。ヘッダやライブラリは上記の規定のディレクトリに配置されるので、追加オプション指定は不要になります。
なお、この方法だと、当然ながら当該ホストの「全ての」ユーザがそのインストールの影響を受けることになりますのでその点はご注意ください。

ソースからのインストール
昔はこちらしかありませんでした。各種環境設定は全て自前でやる必要があります。裏で勝手にゴソゴソやられるのは気に入らんとか開発の都合上複数のバージョンを使い分けたいとかいう人向けです。上級者向けと言われるのはそのためです。

この回答への補足

又も、かゆい所に手が届くアドバイスありがとうございます。

前項までの質問・回答を自分なりに考えまして、以下の事をやってみました。

「見つけたサンプルは表示用と書いてあるけど、DBにアクセスするという事でやってみよう」

「やりたい事と合っているかは分からないけど、やってみれば分かる事もあるだろう」

~実際に行った事~
(1)拾ったサンプルコードをコンパイル
(2)ヘッダファイル(PostgreSQL.h)が見つからないとエラーが出る
(3)位置確認(/usr/local/pgsql/include/server)
(4)再コンパイル
(5)ヘッダファイル(libpq-fe.h)が見つからないとエラーが出る
(6)位置確認(/usr/local/pgsql/include)
(7)…どっちもヘッダファイルだけど違う位置にあるぞ?
オプションで-Iとやって指定する場合どうすれば良いんだ?
ファイルを移動?デフォルトの状態を変えるのはちょっとためらうな…それじゃそのまま残してコピーだけ持って来てみるか?
それとも何か上手い事出来る方法があるのか?
…わからん。

※(1)のサンプルコード先
http://www.atmarkit.co.jp/flinux/rensai/postgres …
(C言語のプログラム(表示用))

と、この状態で止まっていましたがとりあえずコピーしてみた結果は

/usr/local/pgsql/include/postgres.h:70: 構文解析エラー が "int32" の前にあります

と表示され、何が何だか分からないといった感じです。

結果的にCプログラムでDB(PostgreSQL)に有るデータを参照・利用できる、という結果を得たいのですが、何を考えてやっていけば良いでしょう?

補足日時:2008/08/06 17:23
    • good
    • 1
この回答へのお礼

非常に良い回答で助かりました。

お礼日時:2008/08/07 16:48

> コピーだけ持って来てみるか?



これはいけません。元通りにしてください。

> それとも何か上手い事出来る方法があるのか?

-I オプションは複数書いてもいいことになっています。

……が、このサンプルの場合 postgres.h はいらなかったりします。
(ディレクトリ名が示すとおり、サーバ側で動作するプログラムが使うものだからです)
ソース側の include 命令をカットしてもよいでしょう。

この回答への補足

回答ありがとうございます。

色々試した結果、サンプルコードの求める実行結果は得られました。
(DBからデータを取得し、表示する)

コード的には修正箇所として
・postgres.hの削除
・dbnameを作成したDB名に変更
・SELECT文部分でのテーブル名の変更

コマンドは
gcc -I/usr/local/pgsql/include -L/usr/local/pgsql/lib -lpq -o sample sample.c

と記述しました。
THX1138さんの仰られたとおり、オプションのライブラリ部分を抜かすとコンパイル・リンクは通ったのですが、実行結果が上手く得られませんでした。

細かい部分でまだ理解していませんが、とりあえず動かす事が出来ました。何度も回答を頂きありがとうございました。

補足日時:2008/08/07 15:53
    • good
    • 0
この回答へのお礼

非常に良い回答で助かりました。

お礼日時:2008/08/07 16:48

> 質問(1)


その指定だとホームディレクトリの下だけを探すことになります。
confirure スクリプトを実行する時に特にオプションを与えていなければ、デフォルトの
/usr/local/pgsql
に入っている思います。もし
host% ./configure --prefix=/opt/postgresql
のようにやったのであれば指定したところにあります。

> 質問(2)
RPM パッケージでインストールしたのならそうですが、ソースパッケージから作業したのであれば全部入っています。インストール先の include ディレクトリにあるはずです。

> 質問(3)
so(共有ライブラリファイル)はインストール先の lib ディレクトリ、*.h(ヘッダファイル)は include ディレクトリにあるはずです。コンパイル、リンク時に位置をオプションで指定してください。(-I, -L, -l)

この回答への補足

回答ありがとうございます。
全て満足のいく回答で、無事libpq-fe.hを見つける事が出来ました。

ただ「なるほどそういう事か…」と言うだけで、まだ意味は調べていかないと理解出来ていません。

例えば接続のサンプルコードが落ちていたので、それでコンパイルしてみるとlibpq-fe.hヘッダファイルが見つからないのは探す場所が違うんだろうな、何でだろうな…とか。

ソースからとパッケージからのインストール何が違うのかとか。

<コンパイル、リンク時に位置をオプションで指定してください。(-I, -L, -l)
というのは
gcc -o sample sample.c
の様に gcc の後につけるやつの事だよな…とか。

とりあえず自分で調べて見ないとダメですよね。一応勉強なので。
もし時間があったら書込みしておいてもらえると非常に助かります。
なんにせよ進める事が出来そうです。ありがとうございました。

補足日時:2008/08/06 10:02
    • good
    • 0
この回答へのお礼

非常に良い回答で助かりました。

お礼日時:2008/08/07 16:47

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

関連するカテゴリからQ&Aを探す