PostgreSQLのコンパイル、libpqxxのコンパイル編の続きです。PostgreSQL(以降、Postgresと書きます)を使ってデータ管理をしたい、あわよくばC++も使って便利なアプリを作りたいと思って、Postgresとlibpqxxをコンパイルしたものの、謎のコンパイルエラーが出てきて困ってました。
「あっ、通った。今までの時間はいったい…」みたいな解決だったんですが、また同じような目に合うのは嫌なので、解決方法を書いときます。
遭遇したエラー
PostgreSQLとlibpqxxをコンパイル、リンクして.aファイルを作ったところまではなんとか行けました。そして、いざサンプルプログラムをコンパイルしようとするとなぜか通らなかったんです。コンパイルは通っているようだったので、実際にはリンクエラーとかビルドエラーと呼ぶべきでしょうが。
で、表示されていたエラー内容は
in function `wait_fd':
connection_base.cxx:1255: undefined reference to `WSAPoll'
というものでした。connection_base.cxxのwait_fdって関数の中の1255行目でWSAPollってのが呼ばれてるけど、何も定義されてねーぞ!どう処理しろってんだ!?っていうエラーです。
このWSAPollですが、色々と調べてみるとws2_32.libっていうライブラリの中で定義されているようだったので、リンクするときのオプションに-lws2_32ってのを付け足しました。
具体的には、
g++ main.o -lpqxx -lpq
としていたところを
g++ main.o -lpqxx -lpq -lws2_32
という風に変えました。これでリンクも通ってめでたしめでたし。
ビルドするときの注意点
とりあえず、上に書いた記事まででPostgreSQLを使ったプロジェクトは作れるようになってるんですが、そこに行きつくまでに詰まったこととか注意点が全部で2つあるので、そいつらをまとめときます。
- -lws2_32を付け足すのが-lpqxxの前ではいけない
- -lpqxxは-lpqよりも先に書かなければならない
1番が今回僕の詰まったエラーの原因でした。もしも-lws2_32を-lpqxxよりも左側に持ってくると上に書いたようなエラーが起こるのでご注意を。
2番はlibpqxxのgithubページにもある注意です。-lpqを-lpqxxよりも左側に持ってくると、きっとエラーになるんだと思います。
とりあえず、今のところはこれだけです。もしまた何かあれば追記します。というわけで、今回はこの辺で。 さて、何つくろっかな~。