libpqxx: Build failed in Windows 10

Hello,

I’m sorry if this is the wrong place for posting but I’m stuck and a help would be appreciated. I’m new in C++ development. I’m currently working on a project using PostgreSQL database (version 15.3). My code uses C++20.

A have a dependency to libpqxx as a static library, CMake is used to build the project. Here is my configuration :

  • CMake 3.26.4
  • g++ 13.1.0
  • OS : Windows 10, using MSYS-ucrt64
  • libpqxx 7.7.5

CMake does not detect any problem but issues come at build time :

====================[ Build | app | Debug ]=====================================
C:\msys64\ucrt64\bin\cmake.exe --build C:\Users\user\Documents\Workspace\Code\MyProject\cmake-build-debug --target app -j 6
[1/30] Building CXX object src/CMakeFiles/app.dir/main.cpp.obj
[2/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/array.cxx.obj
[3/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/binarystring.cxx.obj
[4/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/cursor.cxx.obj
[5/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/blob.cxx.obj
[6/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/connection.cxx.obj
In file included from C:/Users/user/Documents/Workspace/Code/MyProject/lib/db_connection/external/libpqxx-7.7.5/src/connection.cxx:36:
C:/msys64/ucrt64/include/winsock2.h:15:2: warning: #warning Please include winsock2.h before windows.h [-Wcpp]
   15 | #warning Please include winsock2.h before windows.h
      |  ^~~~~~~
[7/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/encodings.cxx.obj
[8/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/errorhandler.cxx.obj
[9/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/except.cxx.obj
[10/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/field.cxx.obj
[11/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/largeobject.cxx.obj
[12/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/notification.cxx.obj
[13/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/params.cxx.obj
[14/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/result.cxx.obj
[15/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/pipeline.cxx.obj
[16/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/robusttransaction.cxx.obj
[17/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/row.cxx.obj
[18/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/sql_cursor.cxx.obj
[19/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/strconv.cxx.obj
[20/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/stream_from.cxx.obj
[21/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/stream_to.cxx.obj
[22/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/version.cxx.obj
[23/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/subtransaction.cxx.obj
[24/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/time.cxx.obj
[25/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/transaction.cxx.obj
[26/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/wait.cxx.obj
FAILED: src/build-pqxx/src/CMakeFiles/pqxx.dir/wait.cxx.obj 
C:\msys64\ucrt64\bin\g++.exe  -IC:/Users/user/Documents/Workspace/Code/MyProject/cmake-build-debug/src/build-pqxx/include -IC:/Users/user/Documents/Workspace/Code/MyProject/lib/db_connection/external/libpqxx-7.7.5/include -I"C:/Program Files/PostgreSQL/15/include" -I"C:/Program Files/PostgreSQL/15/include/server" -g -std=c++17 -fdiagnostics-color=always -MD -MT src/build-pqxx/src/CMakeFiles/pqxx.dir/wait.cxx.obj -MF src\build-pqxx\src\CMakeFiles\pqxx.dir\wait.cxx.obj.d -o src/build-pqxx/src/CMakeFiles/pqxx.dir/wait.cxx.obj -c C:/Users/user/Documents/Workspace/Code/MyProject/lib/db_connection/external/libpqxx-7.7.5/src/wait.cxx
In file included from C:/Users/user/Documents/Workspace/Code/MyProject/lib/db_connection/external/libpqxx-7.7.5/src/wait.cxx:12:
C:/msys64/ucrt64/include/winsock2.h:15:2: warning: #warning Please include winsock2.h before windows.h [-Wcpp]
   15 | #warning Please include winsock2.h before windows.h
      |  ^~~~~~~
In file included from C:/msys64/ucrt64/include/c++/13.1.0/thread:45,
                 from C:/Users/user/Documents/Workspace/Code/MyProject/lib/db_connection/external/libpqxx-7.7.5/src/wait.cxx:7:
C:/msys64/ucrt64/include/c++/13.1.0/bits/std_thread.h: In function 'bool std::operator==(thread::id, thread::id)':
C:/msys64/ucrt64/include/c++/13.1.0/bits/std_thread.h:330:26: error: no match for 'operator==' (operand types are 'std::thread::native_handle_type' and 'std::thread::native_handle_type')
  330 |     return __x._M_thread == __y._M_thread;
      |            ~~~~~~~~~~~~~ ^~ ~~~~~~~~~~~~~
      |                |                |
      |                |                std::thread::native_handle_type
      |                std::thread::native_handle_type
In file included from C:/msys64/ucrt64/include/c++/13.1.0/iosfwd:42,
                 from C:/msys64/ucrt64/include/c++/13.1.0/bits/std_thread.h:38:
C:/msys64/ucrt64/include/c++/13.1.0/bits/postypes.h:192:5: note: candidate: 'template<class _StateT> bool std::operator==(const fpos<_StateT>&, const fpos<_StateT>&)'
  192 |     operator==(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs)
      |     ^~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/bits/postypes.h:192:5: note:   template argument deduction/substitution failed:
C:/msys64/ucrt64/include/c++/13.1.0/bits/std_thread.h:330:33: note:   'std::thread::native_handle_type' is not derived from 'const std::fpos<_StateT>'
  330 |     return __x._M_thread == __y._M_thread;
      |                                 ^~~~~~~~~
In file included from C:/msys64/ucrt64/include/c++/13.1.0/tuple:38,
                 from C:/msys64/ucrt64/include/c++/13.1.0/bits/std_thread.h:39:
C:/msys64/ucrt64/include/c++/13.1.0/bits/stl_pair.h:812:5: note: candidate: 'template<class _T1, class _T2> constexpr bool std::operator==(const pair<_T1, _T2>&, const pair<_T1, _T2>&)'
  812 |     operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
      |     ^~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/bits/stl_pair.h:812:5: note:   template argument deduction/substitution failed:
C:/msys64/ucrt64/include/c++/13.1.0/bits/std_thread.h:330:33: note:   'std::thread::native_handle_type' is not derived from 'const std::pair<_T1, _T2>'
  330 |     return __x._M_thread == __y._M_thread;
      |                                 ^~~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/tuple:1905:5: note: candidate: 'template<class ... _TElements, class ... _UElements> constexpr bool std::operator==(const tuple<_UTypes ...>&, const tuple<_UTypes ...>&)'
 1905 |     operator==(const tuple<_TElements...>& __t,
      |     ^~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/tuple:1905:5: note:   template argument deduction/substitution failed:
C:/msys64/ucrt64/include/c++/13.1.0/bits/std_thread.h:330:33: note:   'std::thread::native_handle_type' is not derived from 'const std::tuple<_UTypes ...>'
  330 |     return __x._M_thread == __y._M_thread;
      |                                 ^~~~~~~~~
In file included from C:/msys64/ucrt64/include/c++/13.1.0/bits/std_thread.h:43:
C:/msys64/ucrt64/include/c++/13.1.0/bits/unique_ptr.h:829:5: note: candidate: 'template<class _Tp, class _Dp, class _Up, class _Ep> bool std::operator==(const unique_ptr<_Tp, _Dp>&, const unique_ptr<_Up, _Ep>&)'
  829 |     operator==(const unique_ptr<_Tp, _Dp>& __x,
      |     ^~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/bits/unique_ptr.h:829:5: note:   template argument deduction/substitution failed:
C:/msys64/ucrt64/include/c++/13.1.0/bits/std_thread.h:330:33: note:   'std::thread::native_handle_type' is not derived from 'const std::unique_ptr<_Tp, _Dp>'
  330 |     return __x._M_thread == __y._M_thread;
      |                                 ^~~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/bits/unique_ptr.h:837:5: note: candidate: 'template<class _Tp, class _Dp> bool std::operator==(const unique_ptr<_Tp, _Dp>&, nullptr_t)'
  837 |     operator==(const unique_ptr<_Tp, _Dp>& __x, nullptr_t) noexcept
      |     ^~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/bits/unique_ptr.h:837:5: note:   template argument deduction/substitution failed:
C:/msys64/ucrt64/include/c++/13.1.0/bits/std_thread.h:330:33: note:   'std::thread::native_handle_type' is not derived from 'const std::unique_ptr<_Tp, _Dp>'
  330 |     return __x._M_thread == __y._M_thread;
      |                                 ^~~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/bits/unique_ptr.h:845:5: note: candidate: 'template<class _Tp, class _Dp> bool std::operator==(nullptr_t, const unique_ptr<_Tp, _Dp>&)'
  845 |     operator==(nullptr_t, const unique_ptr<_Tp, _Dp>& __x) noexcept
      |     ^~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/bits/unique_ptr.h:845:5: note:   template argument deduction/substitution failed:
C:/msys64/ucrt64/include/c++/13.1.0/bits/std_thread.h:330:33: note:   'std::thread::native_handle_type' is not derived from 'const std::unique_ptr<_Tp, _Dp>'
  330 |     return __x._M_thread == __y._M_thread;
      |                                 ^~~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/bits/std_thread.h:324:3: note: candidate: 'bool std::operator==(thread::id, thread::id)'
  324 |   operator==(thread::id __x, thread::id __y) noexcept
      |   ^~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/bits/std_thread.h:324:25: note:   no known conversion for argument 1 from 'std::thread::native_handle_type' to 'std::thread::id'
  324 |   operator==(thread::id __x, thread::id __y) noexcept
      |              ~~~~~~~~~~~^~~
In file included from C:/msys64/ucrt64/include/winnt.h:648,
                 from C:/msys64/ucrt64/include/minwindef.h:163,
                 from C:/msys64/ucrt64/include/windef.h:9,
                 from C:/msys64/ucrt64/include/windows.h:69,
                 from C:/Program Files/PostgreSQL/15/include/pthread.h:198,
                 from C:/msys64/ucrt64/include/c++/13.1.0/x86_64-w64-mingw32/bits/gthr-default.h:35,
                 from C:/msys64/ucrt64/include/c++/13.1.0/x86_64-w64-mingw32/bits/gthr.h:148,
                 from C:/msys64/ucrt64/include/c++/13.1.0/bits/std_thread.h:46:
C:/msys64/ucrt64/include/guiddef.h:180:15: note: candidate: 'bool operator==(const GUID&, const GUID&)'
  180 | __inline bool operator== (REFGUID guidOne, REFGUID guidOther) { return !!IsEqualGUID (guidOne, guidOther); }
      |               ^~~~~~~~
C:/msys64/ucrt64/include/guiddef.h:180:35: note:   no known conversion for argument 1 from 'std::thread::native_handle_type' to 'const GUID&'
  180 | __inline bool operator== (REFGUID guidOne, REFGUID guidOther) { return !!IsEqualGUID (guidOne, guidOther); }
      |                                   ^
C:/msys64/ucrt64/include/c++/13.1.0/thread: In function 'bool std::operator<(thread::id, thread::id)':
C:/msys64/ucrt64/include/c++/13.1.0/thread:79:26: error: no match for 'operator<' (operand types are 'std::thread::native_handle_type' and 'std::thread::native_handle_type')
   79 |     return __x._M_thread < __y._M_thread;
      |            ~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~
      |                |               |
      |                |               std::thread::native_handle_type
      |                std::thread::native_handle_type
C:/msys64/ucrt64/include/c++/13.1.0/bits/stl_pair.h:835:5: note: candidate: 'template<class _T1, class _T2> constexpr bool std::operator<(const pair<_T1, _T2>&, const pair<_T1, _T2>&)'
  835 |     operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
      |     ^~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/bits/stl_pair.h:835:5: note:   template argument deduction/substitution failed:
C:/msys64/ucrt64/include/c++/13.1.0/thread:79:32: note:   'std::thread::native_handle_type' is not derived from 'const std::pair<_T1, _T2>'
   79 |     return __x._M_thread < __y._M_thread;
      |                                ^~~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/tuple:1947:5: note: candidate: 'template<class ... _TElements, class ... _UElements> constexpr bool std::operator<(const tuple<_UTypes ...>&, const tuple<_UTypes ...>&)'
 1947 |     operator<(const tuple<_TElements...>& __t,
      |     ^~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/tuple:1947:5: note:   template argument deduction/substitution failed:
C:/msys64/ucrt64/include/c++/13.1.0/thread:79:32: note:   'std::thread::native_handle_type' is not derived from 'const std::tuple<_UTypes ...>'
   79 |     return __x._M_thread < __y._M_thread;
      |                                ^~~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/bits/unique_ptr.h:877:5: note: candidate: 'template<class _Tp, class _Dp, class _Up, class _Ep> bool std::operator<(const unique_ptr<_Tp, _Dp>&, const unique_ptr<_Up, _Ep>&)'
  877 |     operator<(const unique_ptr<_Tp, _Dp>& __x,
      |     ^~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/bits/unique_ptr.h:877:5: note:   template argument deduction/substitution failed:
C:/msys64/ucrt64/include/c++/13.1.0/thread:79:32: note:   'std::thread::native_handle_type' is not derived from 'const std::unique_ptr<_Tp, _Dp>'
   79 |     return __x._M_thread < __y._M_thread;
      |                                ^~~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/bits/unique_ptr.h:890:5: note: candidate: 'template<class _Tp, class _Dp> bool std::operator<(const unique_ptr<_Tp, _Dp>&, nullptr_t)'
  890 |     operator<(const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
      |     ^~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/bits/unique_ptr.h:890:5: note:   template argument deduction/substitution failed:
C:/msys64/ucrt64/include/c++/13.1.0/thread:79:32: note:   'std::thread::native_handle_type' is not derived from 'const std::unique_ptr<_Tp, _Dp>'
   79 |     return __x._M_thread < __y._M_thread;
      |                                ^~~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/bits/unique_ptr.h:900:5: note: candidate: 'template<class _Tp, class _Dp> bool std::operator<(nullptr_t, const unique_ptr<_Tp, _Dp>&)'
  900 |     operator<(nullptr_t, const unique_ptr<_Tp, _Dp>& __x)
      |     ^~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/bits/unique_ptr.h:900:5: note:   template argument deduction/substitution failed:
C:/msys64/ucrt64/include/c++/13.1.0/thread:79:32: note:   'std::thread::native_handle_type' is not derived from 'const std::unique_ptr<_Tp, _Dp>'
   79 |     return __x._M_thread < __y._M_thread;
      |                                ^~~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/thread:75:3: note: candidate: 'bool std::operator<(thread::id, thread::id)'
   75 |   operator<(thread::id __x, thread::id __y) noexcept
      |   ^~~~~~~~
C:/msys64/ucrt64/include/c++/13.1.0/thread:75:24: note:   no known conversion for argument 1 from 'std::thread::native_handle_type' to 'std::thread::id'
   75 |   operator<(thread::id __x, thread::id __y) noexcept
      |             ~~~~~~~~~~~^~~
[27/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/util.cxx.obj
[28/30] Building CXX object src/build-pqxx/src/CMakeFiles/pqxx.dir/transaction_base.cxx.obj
ninja: build stopped: subcommand failed.

The same code builds and runs perfectly on Linux (using GCC and CMake too).

I can’t figure out where the issue comes from. Is this related to a bad configuration of the toolchain on Windows ? Is this a known issue ?

Thanks in advance

About this issue

  • Original URL
  • State: closed
  • Created a year ago
  • Comments: 22 (13 by maintainers)

Most upvoted comments

Hi,

Your workaround works ! Thanks a lot ! Now my code can compile.

Just for my knowledge, what does this action imply on the Libpqxx or PostgreSQL operation ? Can it result in malfunctions or some strange behavior ?

Should be fine… The code to “sleep” (e.g. when you wait for notifications) may be a bit less efficient than it could be.