Libpqxx instalacja i używanie w Eclipse CDT Linux


(ktoś tam) #1

Chcę komunikować programy pisane w C++ z bazą danych PostgreSQL. Wybrałem do tego libpqxx. Zainstalowałem PostgreSQL i bibliotekę z repozytorium. System to Linux Mint 17.2. Nie mam pojęcia, jak dodać tę bibliotekę do projektu w Eclipse CDT. Ogólnie jest to pierwsza biblioteka używana w tym IDE.


(ShadowMan_) #2

W twoim przypadku prawdopodobnie pliki nagłówkowe biblioteki są zainstalowane w katalogu /usr/include/pqxx

#includepqxx/pqxx
using namespace pqxx;

i odtąd możesz korzystać z bibloteki w swoim programie.

Ewentualnie jeżeli chciałbyś załączyć do projektu bibliotekę z poza /usr/include/ przechodzisz kolejno zakładki:

ProjectPropeties (rozwijasz) C\C++BuildSettings z listy wybierasz GCC C++ Compiler Includes

w polu Include paths podajesz ścieżkę do plików nagłówkowych np, /usr/include/pqxx

następnie przechodzisz do pozycji GCC C++ LinkerLibraries i w polu Libraries dodajesz nazwę biblioteki np, pqxx

Ostatecznie załączasz plik nagłówkowy do projektu dodając np w pliku main:

#includepqxx
using namespace pqxx;

Drugi sposób jest uniwersalny jeśli chciałbyś korzystać z niestandardowych bibliotek, natomiast jeżeli korzystasz z bibliotek systemowych to ten pierwszy sposób powinien być dla ciebie chyba najbardziej odpowiedni.


(ktoś tam) #3

Okazało się, że coś źle zainstalowałem. Odinstalowałem wszystko i zainstalowałem jeszcze raz. Teraz znajduje mi już pqxx, ale przy próbie skompilowania testowego kodu, wysypują mi się błędy.

#include <iostream>
#include <pqxx/pqxx>

using namespace std;
using namespace pqxx;

int main(int argc, char* argv[])
{
   try{
      connection C("dbname=testdb user=postgres password=cohondob \
      hostaddr=127.0.0.1 port=5432");
      if (C.is_open()) {
         cout << "Opened database successfully: " << C.dbname() << endl;
      } else {
         cout << "Can't open database" << endl;
         return 1;
      }
      C.disconnect ();
   }catch (const std::exception &e){
      cerr << e.what() << std::endl;
      return 1;
   }
}

22:57:56 ****Incremental Build of configuration Debug for project test****
make all 
Building file: ../src/test.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/test.d" -MT"src/test.d" -o "src/test.o" "../src/test.cpp"
Finished building: ../src/test.cpp
 
Building target: test
Invoking: GCC C++ Linker
g++ -o "test" ./src/test.o   
./src/test.o: In function `main':
/media/WS/EclipseWS/test/Debug/../src/test.cpp:12: undefined reference to `pqxx::connection_base::is_open() const'
/media/WS/EclipseWS/test/Debug/../src/test.cpp:13: undefined reference to `pqxx::connection_base::dbname()'
/media/WS/EclipseWS/test/Debug/../src/test.cpp:18: undefined reference to `pqxx::connection_base::disconnect()'
./src/test.o: In function `pqxx::connect_direct::connect_direct(std::string const&)':
/usr/include/pqxx/connection.hxx:87: undefined reference to `pqxx::connectionpolicy::connectionpolicy(std::string const&)'
/usr/include/pqxx/connection.hxx:87: undefined reference to `vtable for pqxx::connect_direct'
./src/test.o: In function `pqxx::connect_direct::~connect_direct()':
/usr/include/pqxx/connection.hxx:84: undefined reference to `vtable for pqxx::connect_direct'
/usr/include/pqxx/connection.hxx:84: undefined reference to `pqxx::connectionpolicy::~connectionpolicy()'
./src/test.o: In function `pqxx::basic_connection<pqxx::connect_direct>::basic_connection(char const*)':
/usr/include/pqxx/basic_connection.hxx:70: undefined reference to `pqxx::connection_base::connection_base(pqxx::connectionpolicy&)'
/usr/include/pqxx/basic_connection.hxx:71: undefined reference to `pqxx::connection_base::init()'
./src/test.o: In function `pqxx::basic_connection<pqxx::connect_direct>::~basic_connection()':
/usr/include/pqxx/basic_connection.hxx:78: undefined reference to `pqxx::connection_base::close()'
collect2: error: ld returned 1 exit status
make: *** [test] Błąd 1

22:57:56 Build Finished (took 384ms)

Ważne, że jest postęp :slight_smile:


(ShadowMan_) #4

W zakładce GCC C++ Linker>>Libraries w oknie Libraries (-l) dopisz pqxx i zapisz zmiany.


(ktoś tam) #5

Za 3 razem zaczęło działać. Teraz dostaję:

FATAL: password authentication failed for user "postgres"

Ale to oznacza, że działa i sobie poradzę. Dzięki

 


(ktoś tam) #6
Opened database successfully: baza_testowa

Jak miło :slight_smile:

 

Chciałbym od razu zacząć kodować, ale trzeba się odwdzięczyć. Co prawda tobie już nie mam jak, ale innym mogę pomóc. Tak więc, przechodząc do rzeczy:

 

  1. Instalacja PostgreSQL:

    apt-get install postgresql-9.3
    postgresql-client
    postgresql-client-9.3
    postgresql-client-common
    postgresql-common
    postgresql-contrib
    postgresql-contrib-9.3

Część jest raczej zbędna, ponieważ chyba tylko doprecyzowuje wersję, ale nie zaszkodzi. Dla nowszych wersji analogicznie, wybrałem tę wersję ponieważ była najnowszą w repozytorium. Aktualną wersję można sprawdzić za pomocą:

apt-cache search postgresql

Następnie należy zmodyfikować plik /etc/postgresql/9.3/main/postgresql.conf

gedit /etc/postgresql/9.3/main/postgresql.conf

Szukamy i zmieniamy “listen_addresses”

listen_addresses = 'localhost, 192.168.0.42, 192.168.0.111'

Podobnie postępujemy z " /etc/postgresql/9.3/main/pg_hba.conf". Powinno to wyglądać tak (gdzieś przy końcu pliku):

# IPv4 local connections:

host all all 127.0.0.1/32 md5

Teraz restartujemy serwer PostgreSQL

/etc/init.d/postgresql restart

 

  1. Instalacja libpqxx:

    apt-get install libpqxx-4.0
    libpqxx-dbg
    libpqxx-dev
    libpqxx-doc

Tak samo, jak w przypadku PostgreSQL, jest to aktualna wersja dostępna w repozytorium i możemy sprawdzić dostępne wersje za pomocą:

apt-cache search libpqxx

 

  1. Używanie w Eclipse:

Jeżeli wszystko przebiegło poprawnie, powinien istnieć katalog “/usr/include/pqxx”, więc powinna wystarczyć dyrektywa:

#include <pqxx/pqxx>

Jeżeli to nie działa, oznacza to, że coś poszło źle. Jeżeli z jakichś powodów katalog znajdowałby się w innym miejscu, można skorzystać z uniwersalnej metody przedstawionej przez @ShadowMan_

 

  1. Pierwsze połączenie:

Dla testu tworzymy “role” (nie wiem, jak to powinno być przetłumaczone

su postgres
psql
CREATE ROLE test_role WITH SUPERUSER CREATEDB LOGIN PASSWORD 'bardzo_tajne_haslo';
CREATE DATABASE baza_testowa OWNER test_role;

Tworzymy nowy projekt i wklejamy do niego kod testowy (przerobiony z przykładowego kodu na tutorialspoint.com :D):

#include iostream
#include pqxx/pqxx

using namespace std;
using namespace pqxx;

int main(int argc, char* argv[])
{
   try{
      connection C("dbname=baza_testowa user=test_role password=bardzo_tajne_haslo hostaddr=127.0.0.1 port=5432");
      if (C.is_open()) {
         cout "Opened database successfully: " C.dbname() endl;
      } else {
         cout "Can't open database" endl;
         return 1;
      }
      C.disconnect ();
   }catch (const std::exception e){
      cerr e.what() std::endl;
      return 1;
   }
}

Kompilujemy, uruchamiamy i dostajemy poniższą linijkę i jesteśmy zadowoleni :slight_smile:

Opened database successfully: baza_testowa

//czyt. Hello World! :)

 

  1. Możemy jeszcze zainstalować sobie pgAdmin III

    apt-get install pgadmin3

Jednak nie będzie on widział naszego serwera. Aby to zmienić, klikamy na ikonkę wtyczki (zwaną także “Zdefiniuj połączenie do serwera”). Następnie wypełniamy formularz.

Nazwa: Test

Host: 127.0.0.1

Port: 5432

Serwis: [pusto]

Serwisowa DB: baza_testowa

Użytkownik: test_role

Hasło: ****************** (bardzo_tajne_haslo :D)

Następnie OK i w drzewku po lewej, w “Serwer Group” powinniśmy znaleźć naszą bazę.