Reputation: 95
I would like to use the std::filesystem
with Qt 5.12.0 with the g++ version Ubuntu 8.2.0-7ubuntu1, but getting linker errors:
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"
After some googling, I found that I need to use the linker flag -lstdc++fs
. My code builds perfectly with the command g++ main.cpp -std=c++17 -lstdc++fs
, but I can't seem to make it work inside Qt Creator. My simple test code is the following:
#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;
}
My .pro file looks like this:
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
After some tests with g++ It seems to me, that the problem is caused by the order of the g++ flags, because Qt puts the -lstdc++fs
to the front.
std::experimental::filesystem
.Upvotes: 3
Views: 4539
Reputation: 4367
<filesystem>
is a separate library for GCC 8 (see this question). Your issue, as you suspected, is in the order of the flags. Poking about a bit in the docs hints that QMAKE_LFLAGS
is more for linker flags than library loads, which is why it gets passed early (e.g. -O3
).
Using LIBS += -lstdc++fs
should work instead.
Credit to this reddit response for this solution.
Upvotes: 4