如何避免 Qt 的 std::filesystem 链接器错误?
How to avoid std::filesystem linker errors with Qt?
我想在 Qt 5.12.0 和 g++ 版本 Ubuntu 8.2.0-7ubuntu1 中使用 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"
谷歌搜索后,我发现我需要使用链接器标志 -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 中构建我的代码?
<filesystem>
是 GCC 8 () 的独立库。正如您所怀疑的那样,您的问题是按照标志的顺序排列的。在文档中稍作探究表明 QMAKE_LFLAGS
更适用于链接器标志而不是库加载,这就是它提前通过的原因(例如 -O3
)。
使用 LIBS += -lstdc++fs
应该可以。
此解决方案归功于 this reddit response。
我想在 Qt 5.12.0 和 g++ 版本 Ubuntu 8.2.0-7ubuntu1 中使用 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"
谷歌搜索后,我发现我需要使用链接器标志 -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 中构建我的代码?
<filesystem>
是 GCC 8 (QMAKE_LFLAGS
更适用于链接器标志而不是库加载,这就是它提前通过的原因(例如 -O3
)。
使用 LIBS += -lstdc++fs
应该可以。
此解决方案归功于 this reddit response。