簡體   English   中英

使用鏈接錯誤<filesystem> C++17 中的成員

[英]Link errors using <filesystem> members in C++17

我在 Ubuntu 16.04 上使用 gcc 7.2,我需要使用 C++17 中的新文件系統庫。 即使確實有一個名為experimental/filesystem 的庫,我也不能使用它的任何成員。 例如,當我嘗試編譯此文件時:

#include <iostream>
#include <string>
#include <experimental/filesystem>
using namespace std;
namespace fs = std::experimental::filesystem::v1;

int main(){
    fs::path p1 = "/usr/share/";
}

我收到一個編譯錯誤,如下所示:

$ g++-7 test.cpp -std=c++17
/tmp/ccfsMnlG.o: In function `std::experimental::filesystem::v1::__cxx11::path::path<char [12], std::experimental::filesystem::v1::__cxx11::path>(char const (&) [12])':
test.cpp:(.text._ZNSt12experimental10filesystem2v17__cxx114pathC2IA12_cS3_EERKT_[_ZNSt12experimental10filesystem2v17__cxx114pathC5IA12_cS3_EERKT_]+0x73): undefined reference to `st
d::experimental::filesystem::v1::__cxx11::path::_M_split_cmpts()'
collect2: error: ld returned 1 exit status

我究竟做錯了什么? 我認為代碼沒有任何問題,因為我只是從網站上復制粘貼的。 我是否使用了錯誤版本的 gcc? 另外,為什么我需要<experimental/filesystem>而不是 C++17 中的<filesystem> 提前致謝。

添加標志-lstdc++fs

$ g++-7 test.cpp -std=c++17 -lstdc++fs

gcc 7.2 僅支持 C++17 實驗性filesystem命名空間。 我不知道,也許 gcc 7.3 已經支持 std filesystem命名空間。

您還可以sudo apt install g++-8並使用#include <filesystem>作為 cppreference 描述,而不是在舊 g++ 和 libstdc++ 版本中使用#include <experimental/filesystem>

如果我在 Ubuntu 中安裝 gcc 8,我會有 2 個不同的 libstdc++ 庫還是僅更新原始庫?

即使較新的應該可以替代舊的,您也可能會擁有兩個。

我注意到libstdc++-8-devg++-8一起安裝。

這對我有用:

g++-8 -g -Wall -std=c++17 test.cpp -lstdc++fs

似乎即使使用g++-8,文件系統庫也不會自動鏈接,您仍然需要提供-lstdc++fs ,並且在語言級別還需要-std=c++17

以下為我工作:

在代碼中:

#include <filesystem>
namespace filesystem = std::filesystem;

在 CMakeLists 中:

set (CMAKE_CXX_FLAGS "-lstdc++fs -std=c++17")

在帶有 GCC 10 的 Ubuntu 18.04 上。

在默認的 CMakeLists.txt 中,一個讓我躲了幾個小時但尚未提及的基本要素是:

target_compile_features(compare_files PUBLIC cxx_std_11)
需要改為:
target_compile_features(compare_files PUBLIC cxx_std_17)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM