Как избежать ошибок компоновщика std :: filesystem с Qt? - PullRequest
2 голосов
/ 24 марта 2019

Я хотел бы использовать std::filesystem с Qt 5.12.0 с версией g ++ Ubuntu 8.2.0-7ubuntu1, но получаю ошибки компоновщика:

g++ -lstdc++fs -Wl,-rpath,/home/user/Qt/5.12.0/gcc_64/lib -o qf_filesystem_test main.o   -L/home/user/Qt/5.12.0/gcc_64/lib -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread   
/usr/bin/ld: main.o: in function `std::filesystem::exists(std::filesystem::__cxx11::path const&)':
/usr/include/c++/8/bits/fs_ops.h:121: undefined reference to `std::filesystem::status(std::filesystem::__cxx11::path const&)'
/usr/bin/ld: main.o: in function `std::filesystem::__cxx11::path::path<char*, std::filesystem::__cxx11::path>(char* const&, std::filesystem::__cxx11::path::format)':
/usr/include/c++/8/bits/fs_path.h:183: undefined reference to `std::filesystem::__cxx11::path::_M_split_cmpts()'
collect2: error: ld returned 1 exit status
make: *** [Makefile:257: qf_filesystem_test] Error 1
22:12:16: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project qf_filesystem_test (kit: Desktop Qt 5.12.0 GCC 64bit)
When executing step "Make"

После некоторого поиска в Google я обнаружил, что янужно использовать флаг компоновщика -lstdc++fs.Мой код прекрасно собирается с помощью команды g++ main.cpp -std=c++17 -lstdc++fs, но я не могу заставить его работать внутри Qt Creator.Мой простой тестовый код выглядит следующим образом:

#include <iostream>
#include <filesystem>

int main(int argc, char *argv[])
{
    if(1 < argc)
    {
        std::cout << argv[1] << " does ";
        if(!std::filesystem::exists(std::filesystem::path(argv[1]))) std::cout << "not ";
        std::cout << "exist!" << std::endl;
    }

    return 0;
}

Мой файл .pro выглядит следующим образом:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = qf_filesystem_test
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

CONFIG += c++17
QMAKE_LFLAGS += -lstdc++fs

SOURCES += main.cpp

После некоторых тестов с g ++ Мне кажется, что проблема вызванапорядок флагов g ++, потому что Qt ставит -lstdc++fs на передний план.

  • Почему мне все еще нужно использовать этот флаг?Я думал, что g ++ 8 уже поддерживает C ++ 17, и этот флаг необходим, только если я хочу использовать std::experimental::filesystem.
  • Как мне сделать сборку кода в Qt Creator?

1 Ответ

1 голос
/ 25 марта 2019

<filesystem> - это отдельная библиотека для GCC 8 ( см. Этот вопрос ).Ваша проблема, как вы подозревали, находится в порядке флагов.Немного посмотрев в документах, намекает, что QMAKE_LFLAGS больше для флагов компоновщика, чем для загрузки библиотеки, поэтому он передается раньше (например, -O3).

Использование LIBS += -lstdc++fs должно работать вместо.

Кредит этого ответа Reddit для этого решения.

...