Intento usar las nuevas funciones de c ++ 1z en la cabeza del desarrollo dentro de gcc 6.0.
Si pruebo este pequeño ejemplo:
#include <iostream>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
int main()
{
fs::path p1 = "/home/pete/checkit";
std::cout << "p1 = " << p1 << std::endl;
}
Tengo:
/ opt / linux-gnu_6-20151011 / bin / g ++ --std = c ++ 1z main.cpp -O2 -g -o ir /tmp/ccaGzqFO.o: En la función \ `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: referencia indefinida a `std :: experimental :: filesystem :: v1 :: __ cxx11 :: path :: _ M_split_cmpts () ' collect2: error: ld devolvió 1 estado de salida
La versión gcc es la instantánea linux-gnu_6-20151011
¿Alguna sugerencia de cómo vincular las nuevas funciones de c ++ 1z?
c++ -lstd++fs main.cpp
. Estoy utilizandogcc version 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)
-lstdc++fs
tiene que estar al final de la línea (al menos después del archivo fuente). No entiendo por qué algunos-lxxx
necesitan estar al final y otros no.Si está utilizando cmake, agregue la siguiente línea a
CMakeLists.txt
:Para que cmake pueda vincularse con la biblioteca correspondiente.
fuente
target_link_libraries(hello_world_ stdc++fs)
y lo compilé.Con clang 4.0+, necesitas enlazar contra
libc++experimental.a
Asegúrese de que está compilando con libc ++ (no libstdc ++) con -stdlib = libc ++ (como se menciona en los comentarios)
fuente
-stdlib=libc++
orset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
Aquí hay una demostración que podría ser útil para alguien en el futuro:
env:
el6
,gcc/5.5.0
Los siguientes son compilación y prueba. Las banderas son
-std=c++17
-lstdc++fs
:También funciona con banderas:
-std=c++11
Lo siguiente tuvo error de compilación
_ZNSt12experimental10filesystem2v112current_pathB5cxx11Ev
fuente