如何避免Qt的std :: filesystem链接器错误?

问题描述 投票:2回答:1

我想在Qt 5.12.0中使用std::filesystem和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"

经过一些谷歌搜索,我发现我需要使用链接器标志-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中构建我的代码?
qt g++ c++17 std-filesystem
1个回答
1
投票

<filesystem>是GCC 8(see this question)的独立图书馆。您怀疑的问题是按标志的顺序排列。在文档中略微提一下QMAKE_LFLAGS更多的是链接器标志而不是库加载,这就是它早期传递的原因(例如-O3)。

使用LIBS += -lstdc++fs应该工作。

感谢this reddit response提供此解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.