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

时间:2019-03-23 22:21:14

标签: qt g++ c++17 std-filesystem

我想在Qt 5.12.0和g ++版本Ubuntu 8.2.0-7ubuntu1上使用(1 2),但出现链接器错误:

(1 2)

在进行一些谷歌搜索之后,我发现我需要使用链接器标志std::filesystem。我的代码可以使用命令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" 完美地构建,但是我似乎无法使其在Qt Creator中运行。我的简单测试代码如下:

-lstdc++fs

我的.pro文件如下:

g++ main.cpp -std=c++17 -lstdc++fs

在使用g ++进行了一些测试之后,在我看来,问题是由g ++标志的顺序引起的,因为Qt将#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; } 放在了前面。

  • 为什么我仍然需要使用此标志?我以为g ++ 8已经支持C ++ 17,只有在我想使用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 时才需要此标志。
  • 如何在Qt Creator中构建代码?

1 个答案:

答案 0 :(得分:0)

<filesystem>是GCC 8(see this question)的独立库。您所怀疑的问题是按标志顺序排列的。在文档中仔细研究一下,暗示QMAKE_LFLAGS对于链接器标志的作用要大于库加载的作用,这就是为什么它要及早传递的原因(例如-O3)。

应该使用LIBS += -lstdc++fs

为此解决方案贷记this reddit response