c++cmakelibpqxx

How to add libpqxx library to cmake?


I am working on my C++ simple project. I faced a crucial problem in CMakelists.txt. I cannot link libpqxx library correctly.

I am using

This my CMakelists.txt:

cmake_minimum_required(VERSION 3.10)
project(myserver)

set(CMAKE_CXX_STANDARD 17)

find_package(Boost)
IF (Boost_FOUND)
   include_directories(${Boost_INCLUDE_DIR})
endif()

link_directories(/usr/local/lib)
include_directories(/usr/local/include)

file(GLOB_RECURSE SOURCE_FILES "src/*.cpp")

add_executable(myserver ${SOURCE_FILES})

TARGET_LINK_LIBRARIES(myserver  ${LIBRARIES})

Solution

  • libpqxx with cmake example without building libpqxx in cmake

    Setup environment

    1. Install CMake

    cd ~
    wget https://github.com/Kitware/CMake/releases/download/v3.14.5/cmake-3.14.5.tar.gz
    tar xf cmake-3.14.5.tar.gz
    cd cmake-3.14.5
    ./bootstrap --parallel=10
    make -j4
    sudo make -j4 install
    

    2. Install libpqxx

    cd ~
    git clone https://github.com/jtv/libpqxx.git
    ./configure
    make -j4
    sudo make install
    
    

    How to build

    mkdir build
    cd build
    cmake ..
    cmake --build .
    

    How to run

    ./main
    
    Opened database successfully: postgres
    

    Project

    CMakeLists.txt

    cmake_minimum_required (VERSION 3.10)
    project(example VERSION 1.0.0 LANGUAGES CXX)
    
    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(CMAKE_CXX_EXTENSIONS OFF)
    
    add_executable(main main.cpp)
    
    target_link_libraries(main -lpqxx -lpq)
    

    main.cpp

    #include <iostream>
    #include <pqxx/pqxx>
    
    using namespace std;
    using namespace pqxx;
    
    int main(int argc, char *argv[])
    {
        try
        {
            connection C("dbname = postgres user = postgres password = mysecretpassword \
          hostaddr = 127.0.0.1 port = 5433");
            if (C.is_open())
            {
                cout << "Opened database successfully: " << C.dbname() << endl;
            }
            else
            {
                cout << "Can't open database" << endl;
                return 1;
            }
        }
        catch (const std::exception &e)
        {
            cerr << e.what() << std::endl;
            return 1;
        }
    }
    

    libpqxx with cmake example with building libpqxx in cmake

    Setup environment

    1. Install CMake

    cd ~
    wget https://github.com/Kitware/CMake/releases/download/v3.14.5/cmake-3.14.5.tar.gz
    tar xf cmake-3.14.5.tar.gz
    cd cmake-3.14.5
    ./bootstrap --parallel=10
    make -j4
    sudo make -j4 install
    

    How to build

    mkdir build
    cd build
    cmake ..
    cmake --build .
    

    How to run

    ./main
    
    Opened database successfully: postgres
    

    Project

    CMakeLists.txt

    include(FetchContent)
    
    cmake_minimum_required (VERSION 3.10)
    project(example VERSION 1.0.0 LANGUAGES CXX)
    
    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(CMAKE_CXX_EXTENSIONS OFF)
    
    FetchContent_Declare(
      libpqxx
      GIT_REPOSITORY https://github.com/jtv/libpqxx.git
      GIT_TAG a6b1d60e74c1427c8ac2324b85cd4a0dc2068332
    )
    set(PQXX_LIBRARIES pqxx_static)
    
    FetchContent_MakeAvailable(libpqxx)
    
    add_executable(main main.cpp)
    
    target_link_libraries(main "${PQXX_LIBRARIES}")
    
    
    
    

    main.cpp

    #include <iostream>
    #include <pqxx/pqxx>
    
    using namespace std;
    using namespace pqxx;
    
    int main(int argc, char *argv[])
    {
        try
        {
            connection C("dbname = postgres user = postgres password = mysecretpassword \
          hostaddr = 127.0.0.1 port = 5433");
            if (C.is_open())
            {
                cout << "Opened database successfully: " << C.dbname() << endl;
            }
            else
            {
                cout << "Can't open database" << endl;
                return 1;
            }
        }
        catch (const std::exception &e)
        {
            cerr << e.what() << std::endl;
            return 1;
        }
    }
    

    Source code: libpqxx with cmake example