web-dev-qa-db-fra.com

Construire un projet avec "experimental / filesystem" en utilisant cmake

J'ai besoin d'ajouter un en-tête "experimental/filesystem" à mon projet

#include <experimental/filesystem>
int main() {
    auto path = std::experimental::filesystem::current_path();
    return 0;
}

J'ai donc utilisé l'indicateur -lstdc ++ fs et lié à libstdc ++ fs.a

cmake_minimum_required(VERSION 3.7)
project(testcpp)
set(CMAKE_CXX_FLAGS "-std=c++14 -lstdc++fs" )
set(SOURCE_FILES main.cpp)
target_link_libraries(${PROJECT_NAME} /usr/lib/gcc/x86_64-linux-gnu/7/libstdc++fs.a)
add_executable(testcpp ${SOURCE_FILES})

Cependant, j'ai la prochaine erreur:

Erreur CMake sur CMakeLists.txt: 9 (target_link_libraries): Impossible de spécifier des bibliothèques de liens pour la cible "testcpp" qui n'est pas construite par
ce projet.

Mais si je compile directement, c'est OK:

g++-7 -std=c++14 -lstdc++fs  -c main.cpp -o main.o
g++-7 -o main main.o /usr/lib/gcc/x86_64-linux-gnu/7/libstdc++fs.a

Où est mon erreur?

13
NikBond

C'est juste que l'appel target_link_libraries() doit venir après l'appel add_executable(). Sinon, la cible testcpp n'est pas encore connue. CMake analyse tout séquentiellement.

Donc, pour être complet, voici une version de travail de votre exemple que j'ai testée:

cmake_minimum_required(VERSION 3.7)

project(testcpp)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# NOTE: The following would add library with absolute path
#       Which is bad for your projects cross-platform capabilities
#       Just let the linker search for it
#add_library(stdc++fs UNKNOWN IMPORTED)
#set_property(TARGET stdc++fs PROPERTY IMPORTED_LOCATION "/usr/lib/gcc/x86_64-linux-gnu/7/libstdc++fs.a")

set(SOURCE_FILES main.cpp)
add_executable(testcpp ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} stdc++fs)
15
Florian