0

MSYS を使用して、libpq をコンパイルしました (postgres のコンパイルから)。次に libpqxx をコンパイルしました。ここで、libpqxx を使用するクライアントを作成したいと考えています。libpq は問題なく動作しているように見えました。また、libpqxx でコードをコンパイルできます。ただし、libpq クライアント アプリケーションのリンクは失敗します。

これが私のコードです:


#include <pqxx/pqxx>
#include <iostream>
using namespace std;
using namespace pqxx;

int main() {
    connection Conn("dbname=test");
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    return 0;
}

リンクにたくさんのライブラリを追加しましたが、それが突然機能することを望んでいませんでした。これが私がこれまでに持っているものです:

g++ -IC:\msys\1.0\local\pgsql\include -IC:\msys\1.0\local\include -O0 -g3 -Wall -c -fmessage-length=0 -osrc\Controller.o ..\src\コントローラ.cpp
g++ -LC:\MinGW\lib -LC:\msys\1.0\local\pgsql\lib -LC:\msys\1.0\local\lib -oController.exe src\Controller.o -lws2_32 -lole32 -lpqxx -lpq - loleaut32 -luuid
C:\msys\1.0\local\lib/libpqxx.a(connection_base.o): 関数 `ZN45_GLOBAL__N__ZN4pqxx16encrypt_passwordERKSsS1_7wait_fdEibP7timeval' 内:
C:/msys/1.0/home/rsolomon/libpqxx/libpqxx-3.0.2/src/connection_base.cxx:1434: `select@20' への未定義の参照
C:\msys\1.0\local\lib/libpqxx.a(connection_base.o): 関数 `ZN4pqxx15connection_base12check_resultERKNS_6resultE' 内:
C:/msys/1.0/home/rsolomon/libpqxx/libpqxx-3.0.2/src/connection_base.cxx:420: `select@20' への未定義の参照
collect2: ld が 1 つの終了ステータスを返しました
ビルド エラーが発生したため、ビルドが停止されました
消費時間: 1770 ミリ秒。  

-lws2_32 が「select@20」を与えるべきだったと思います。なぜリンカはとても高尚なのですか?

4

1 に答える 1

2

Unix リンカは、伝統的にライブラリを左から右に処理します。したがって、最初に を考慮ws2_32し、あまり使用されていないことがわかり、次に pqxx に進み、select が未定義であり、後のライブラリのいずれによっても定義されていないことがわかります。IOW、ws2_32コマンド ラインの最後に移動してみてください。

于 2009-09-02T03:36:57.633 に答える