2009-09-02 2 views
0

Используя MSYS, я скомпилировал libpq (из компиляции postgres). Затем я скомпилировал libpqxx. Теперь я хочу создать клиент, который будет использовать libpqxx. Очевидно, что libpq работает нормально. И я могу скомпилировать код с libpqxx. Однако соединение с клиентским приложением libpq завершается с ошибкой.Невозможно связать libpqxx в MinGW

Вот мой код:


#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; 
} 

Я добавил кучу LIBS по ссылке в тщетной надежде, что он внезапно работать. Вот то, что я до сих пор:

 
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\Controller.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): In function `ZN45_GLOBAL__N__ZN4pqxx16encrypt_passwordERKSsS1_7wait_fdEibP7timeval': 
C:/msys/1.0/home/rsolomon/libpqxx/libpqxx-3.0.2/src/connection_base.cxx:1434: undefined reference to `[email protected]' 
C:\msys\1.0\local\lib/libpqxx.a(connection_base.o): In function `ZN4pqxx15connection_base12check_resultERKNS_6resultE': 
C:/msys/1.0/home/rsolomon/libpqxx/libpqxx-3.0.2/src/connection_base.cxx:420: undefined reference to `[email protected]' 
collect2: ld returned 1 exit status 
Build error occurred, build is stopped 
Time consumed: 1770 ms. 

Я домысливать -lws2_32 должен уже дал мне «выбрать @ 20». Почему линкер так расстроен?

ответ

2

Компилятор Unix традиционно обрабатывает библиотеки слева направо. Поэтому он сначала рассматривает ws2_32, обнаруживает, что он не очень полезен, затем переходит к pqxx и видит, что select не определен и не определяется какой-либо из более поздних библиотек. IOW, попробуйте переместить ws2_32 в конец командной строки.

+0

Вау! Это сработало. Итак, порядок -l должен идти от конкретных библиотек, которые я использую сначала для самых транзитивных библиотек? Наверное, я обнаружил, что это трудно. – User1

+0

Могу ли я когда-нибудь понадобиться -l для одной и той же библиотеки? – User1

+1

Unix традиционно имеет tsort (1), чтобы вычислить топологический порядок, хотя он широко не используется ... В любом случае, возможно, вам придется добавлять библиотеки дважды, если существует циклическая зависимость между библиотеками - что вы не должны если ваши библиотеки правильно сложены. –

Смежные вопросы