Eu tento usar os novos recursos do c ++ 1z na cabeça do desenvolvimento dentro do gcc 6.0.
Se eu tentar este pequeno exemplo:
#include <iostream>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
int main()
{
fs::path p1 = "/home/pete/checkit";
std::cout << "p1 = " << p1 << std::endl;
}
Eu tenho:
/ opt / linux-gnu_6-20151011 / bin / g ++ --std = c ++ 1z main.cpp -O2 -g -o go /tmp/ccaGzqFO.o: Na função \ `std :: experimental :: filesystem :: v1 :: __ cxx11 :: path :: path (char const (&) [36]) ': /opt/linux-gnu_6-20151011/include/c++/6.0.0/experimental/bits/fs_path.h:167: referência indefinida a `std :: experimental :: filesystem :: v1 :: __ cxx11 :: path :: _ M_split_cmpts () ' collect2: erro: ld retornou 1 status de saída
A versão do gcc é o instantâneo linux-gnu_6-20151011
Alguma dica de como vincular os novos recursos do c ++ 1z?
c++ -lstd++fs main.cpp
. Estou usandogcc version 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)
-lstdc++fs
tem que estar no final da linha (depois do arquivo fonte pelo menos). Não entendo por que alguns-lxxx
precisam estar no final e outros não.Se você estiver usando cmake, adicione a seguinte linha a
CMakeLists.txt
:Para que o cmake possa ser vinculado à biblioteca correspondente.
fonte
target_link_libraries(hello_world_ stdc++fs)
e compilou.Com o clang 4.0+, você precisa vincular
libc++experimental.a
Certifique-se de que está compilando com libc ++ (não libstdc ++) com -stdlib = libc ++ (conforme mencionado nos comentários)
fonte
-stdlib=libc++
ouset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
Aqui está uma demonstração que pode ser útil para alguém no futuro:
env:
el6
,gcc/5.5.0
A seguir estão compilando e testando. As bandeiras são
-std=c++17
-lstdc++fs
:Também funciona com sinalizadores:
-std=c++11
O seguinte teve erro de compilação
_ZNSt12experimental10filesystem2v112current_pathB5cxx11Ev
fonte