libpqxx: Cannot build using mingw on Ubuntu and conan

Hey,

when I try to build an app that uses this library and wxWidgets. When ever I try to build the app using mingw on Ubuntu it fails with the following error:

/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(main.cpp.obj):main.cpp:(.text.startup+0x2b): undefined reference to `pqxx::internal::demangle_type_name[abi:cxx11](char const*)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(main.cpp.obj):main.cpp:(.text.startup+0x4a): undefined reference to `pqxx::internal::demangle_type_name[abi:cxx11](char const*)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(main.cpp.obj):main.cpp:(.text.startup+0x89): undefined reference to `pqxx::internal::demangle_type_name[abi:cxx11](char const*)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(main.cpp.obj):main.cpp:(.text.startup+0xa8): undefined reference to `pqxx::internal::demangle_type_name[abi:cxx11](char const*)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainApp.cpp.obj):MainApp.cpp:(.text.startup+0x2b): undefined reference to `pqxx::internal::demangle_type_name[abi:cxx11](char const*)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainApp.cpp.obj):MainApp.cpp:(.text.startup+0x4a): more undefined references to `pqxx::internal::demangle_type_name[abi:cxx11](char const*)' follow
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x24b9): undefined reference to `pqxx::connection::init(char const*)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x24f4): undefined reference to `pqxx::internal::basic_transaction::basic_transaction(pqxx::connection&, pqxx::zview)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x253d): undefined reference to `pqxx::connection::esc[abi:cxx11](std::basic_string_view<char, std::char_traits<char> >) const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x274a): undefined reference to `pqxx::transaction_base::exec(std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> >)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2782): undefined reference to `pqxx::result::begin() const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x278a): undefined reference to `pqxx::result::size() const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2794): undefined reference to `pqxx::result::columns() const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x27b5): undefined reference to `pqxx::row::row(pqxx::result const&, int, int)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2e23): undefined reference to `pqxx::row::operator[](pqxx::zview) const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2e2b): undefined reference to `pqxx::field::is_null() const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2e3b): undefined reference to `pqxx::field::size() const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2e46): undefined reference to `pqxx::field::c_str() const &'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2e5e): undefined reference to `pqxx::internal::float_traits<float>::from_string(std::basic_string_view<char, std::char_traits<char> >)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2e92): undefined reference to `pqxx::row::operator[](pqxx::zview) const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2e9a): undefined reference to `pqxx::field::is_null() const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2eaa): undefined reference to `pqxx::field::size() const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2eb5): undefined reference to `pqxx::field::c_str() const &'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2ecd): undefined reference to `pqxx::internal::float_traits<float>::from_string(std::basic_string_view<char, std::char_traits<char> >)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2f02): undefined reference to `pqxx::row::operator[](pqxx::zview) const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2f0a): undefined reference to `pqxx::field::is_null() const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2f1a): undefined reference to `pqxx::field::size() const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2f25): undefined reference to `pqxx::field::c_str() const &'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2f3d): undefined reference to `pqxx::internal::float_traits<double>::from_string(std::basic_string_view<char, std::char_traits<char> >)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2f73): undefined reference to `pqxx::row::operator[](pqxx::zview) const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2f7b): undefined reference to `pqxx::field::is_null() const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2f8b): undefined reference to `pqxx::field::size() const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2f96): undefined reference to `pqxx::field::c_str() const &'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2fae): undefined reference to `pqxx::internal::float_traits<double>::from_string(std::basic_string_view<char, std::char_traits<char> >)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2fed): undefined reference to `pqxx::row::operator[](pqxx::zview) const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x2ff5): undefined reference to `pqxx::field::c_str() const &'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x310d): undefined reference to `pqxx::row::operator[](pqxx::zview) const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x3115): undefined reference to `pqxx::field::c_str() const &'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x3225): undefined reference to `pqxx::row::operator[](pqxx::zview) const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x322d): undefined reference to `pqxx::field::c_str() const &'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x3aed): undefined reference to `pqxx::transaction_base::commit()'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x3c9e): undefined reference to `pqxx::transaction_base::close()'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x3ca6): undefined reference to `pqxx::internal::basic_transaction::~basic_transaction()'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x3cb3): undefined reference to `pqxx::connection::close()'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x3f2d): undefined reference to `pqxx::internal::check_pqxx_version_7_7()'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x422f): undefined reference to `pqxx::internal::throw_null_conversion(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x423b): undefined reference to `pqxx::internal::throw_null_conversion(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x4247): undefined reference to `pqxx::internal::throw_null_conversion(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x4253): undefined reference to `pqxx::internal::throw_null_conversion(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x43a5): undefined reference to `pqxx::transaction_base::close()'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text+0x43ad): undefined reference to `pqxx::internal::basic_transaction::~basic_transaction()'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text$_ZN4pqxx11transactionILNS_15isolation_levelE0ELNS_12write_policyE1EED1Ev[_ZN4pqxx11transactionILNS_15isolation_levelE0ELNS_12write_policyE1EED1Ev]+0x14): undefined reference to `pqxx::transaction_base::close()'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text$_ZN4pqxx11transactionILNS_15isolation_levelE0ELNS_12write_policyE1EED1Ev[_ZN4pqxx11transactionILNS_15isolation_levelE0ELNS_12write_policyE1EED1Ev]+0x22): undefined reference to `pqxx::internal::basic_transaction::~basic_transaction()'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text$_ZN4pqxx11transactionILNS_15isolation_levelE0ELNS_12write_policyE1EED0Ev[_ZN4pqxx11transactionILNS_15isolation_levelE0ELNS_12write_policyE1EED0Ev]+0x14): undefined reference to `pqxx::transaction_base::close()'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text$_ZN4pqxx11transactionILNS_15isolation_levelE0ELNS_12write_policyE1EED0Ev[_ZN4pqxx11transactionILNS_15isolation_levelE0ELNS_12write_policyE1EED0Ev]+0x1c): undefined reference to `pqxx::internal::basic_transaction::~basic_transaction()'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text$_ZN4pqxx10connectionD1Ev[_ZN4pqxx10connectionD1Ev]+0xc): undefined reference to `pqxx::connection::close()'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text.startup+0x2b): undefined reference to `pqxx::internal::demangle_type_name[abi:cxx11](char const*)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text.startup+0x4a): undefined reference to `pqxx::internal::demangle_type_name[abi:cxx11](char const*)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text.startup+0x78): undefined reference to `pqxx::internal::demangle_type_name[abi:cxx11](char const*)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text.startup+0xa6): undefined reference to `pqxx::internal::demangle_type_name[abi:cxx11](char const*)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text.startup+0xd4): undefined reference to `pqxx::internal::demangle_type_name[abi:cxx11](char const*)'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.text.startup+0xf3): more undefined references to `pqxx::internal::demangle_type_name[abi:cxx11](char const*)' follow
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.rdata$_ZTVN4pqxx11transactionILNS_15isolation_levelE0ELNS_12write_policyE1EEE[_ZTVN4pqxx11transactionILNS_15isolation_levelE0ELNS_12write_policyE1EEE]+0x20): undefined reference to `pqxx::internal::basic_transaction::do_commit()'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/filament_manager.dir/objects.a(MainWindow.cpp.obj):MainWindow.cpp:(.rdata$_ZTVN4pqxx11transactionILNS_15isolation_levelE0ELNS_12write_policyE1EEE[_ZTVN4pqxx11transactionILNS_15isolation_levelE0ELNS_12write_policyE1EEE]+0x28): undefined reference to `pqxx::transaction_base::do_abort()'
collect2: error: ld returned 1 exit status
gmake[2]: *** [CMakeFiles/filament_manager.dir/build.make:151: bin/filament_manager.exe] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:526: CMakeFiles/filament_manager.dir/all] Error 2
gmake: *** [Makefile:149: all] Error 2
The command '/bin/sh -c cmake --build build/' returned a non-zero code: 2

The issue can be reproduced with the following Dockerfile:

FROM ubuntu:rolling

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get upgrade -y
RUN apt-get install mingw-w64 mingw-w64-x86-64-dev g++-mingw-w64-x86-64 gcc-mingw-w64-x86-64 binutils-mingw-w64-x86-64 build-essential cmake git wget -y
RUN wget https://github.com/conan-io/conan/releases/latest/download/conan-ubuntu-64.deb
RUN dpkg -i conan-ubuntu-64.deb
RUN git clone https://github.com/DerKnerd/filament-browser.git
WORKDIR /filament-browser
RUN git checkout e513b687d92de70bd83ad100b642032c8c44124c
RUN git submodule update --init --recursive
RUN cmake -DCMAKE_TOOLCHAIN_FILE=/filament-browser/mingw-w64-x86_64.cmake -B build -S /filament-browser -DCMAKE_BUILD_TYPE=Release
RUN cmake --build build/

And here is the CMakeList.txt I use:

cmake_minimum_required(VERSION 3.16)
project(filament_manager CXX)

set(CMAKE_CXX_STANDARD 20)

include(./ucm.cmake)
include(./conan.cmake)

ucm_set_runtime(STATIC)
if (WIN32 OR MINGW)
    add_compile_definitions(__WXMSW__ _UNICODE)
    set(BUILD_SHARED_LIBS false)
    set(CMAKE_SYSTEM_NAME Windows)
    set(CMAKE_SYSTEM_PROCESSOR x86_64)
    set(CONAN_ARCHITECTURE x86_64)
    set(CMAKE_WIN32_EXECUTABLE 1)
    set(options Poco:enable_netssl_win=True Poco:enable_netssl=False)

    conan_cmake_run(
            BASIC_SETUP
            ARCH ${CONAN_ARCHITECTURE}
            ENV CC=${CMAKE_C_COMPILER}
            ENV CXX=${CMAKE_CXX_COMPILER}
            ENV CFLAGS=${CMAKE_C_FLAGS}
            ENV CXXFLAGS=${CMAKE_CXX_FLAGS}
            SETTINGS os=Windows
            SETTINGS compiler.cppstd=20
    )
endif ()

set(wxUSE_STL ON)
set(wxBUILD_SHARED OFF)
add_subdirectory(libs/wxWidgets)

list(APPEND CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR})
list(APPEND CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR})

conan_cmake_configure(
        REQUIRES libpqxx/7.7.0
        GENERATORS cmake_find_package
)

conan_cmake_autodetect(settings)

conan_cmake_install(PATH_OR_REFERENCE .
        BUILD missing
        REMOTE conancenter
        SETTINGS ${settings}
        SETTINGS ${CONAN_SETTINGS}
        OPTIONS Poco:enable_netssl_win=True Poco:enable_netssl=False)

find_package(libpqxx)

add_executable(filament_manager ${target} main.cpp MainApp.h MainApp.cpp MainWindow.cpp MainWindow.h)
target_link_libraries(filament_manager PRIVATE libpqxx::libpqxx wx::core wx::base)

And this is the toolchain file:

# Sample toolchain file for building for Windows from an Ubuntu Linux system.
#
# Typical usage:
#    *) install cross compiler: `sudo apt-get install mingw-w64`
#    *) cd build
#    *) cmake -DCMAKE_TOOLCHAIN_FILE=~/mingw-w64-x86_64.cmake ..

set(CMAKE_SYSTEM_NAME Windows)
set(TOOLCHAIN_PREFIX x86_64-w64-mingw32)

# cross compilers to use for C, C++ and Fortran
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++)
set(CMAKE_Fortran_COMPILER ${TOOLCHAIN_PREFIX}-gfortran)
set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres)

# target environment on the build host system
set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX})

# modify default behavior of FIND_XXX() commands
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

Do you by any chance know what causes this issue?

About this issue

  • Original URL
  • State: closed
  • Created 2 years ago
  • Comments: 41 (25 by maintainers)

Most upvoted comments

Messed up 7.7.1, so did a new release: 7.7.2.

I create PR #550, this change should avoid the stat: libs/libpqxx/src/libpqxx.a: Too many levels of symbolic links error.