Построить проект с помощью "экспериментальной/файловой системы" с помощью cmake

Мне нужно добавить заголовок "экспериментальная/файловая система" в мой проект

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

Итак, я использовал флаг -lstdС++ fs и связался с libstdС++ 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})

Однако у меня есть следующая ошибка:

Ошибка CMake в CMakeLists.txt: 9 (target_link_libraries): не удается указать библиотеки ссылок для целевого "testcpp", который не создан с помощью этот проект.

Но если я скомпилирую напрямую, это нормально:

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

Где моя ошибка?

Ответ 1

Просто target_link_libraries() должен идти после add_executable(). В противном случае цель testcpp пока не известна. CMake разбирает все последовательно.

Итак, для полноты, вот рабочая версия вашего примера, который я тестировал:

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)

Ответ 2

К сожалению, это все еще открытый вопрос: https://gitlab.kitware.com/cmake/cmake/issues/17834

Как отмечено в выпуске, существует модуль поиска, который можно использовать в это время: https://github.com/vector-of-bool/CMakeCM/blob/master/modules/FindFilesystem.cmake, https://github.com/летальный-гитара /RigelEngine/BLOB/Master/CMake/Модули /FindFilesystem.cmake

Я хотел бы отметить, что принятый ответ не очень хорош, поскольку он жестко кодирует имя библиотеки. Например, использование libc++ вместо libstdc++ не рассматривается. Кроме того, при GCC> = 9 связывание с библиотекой файловой системы больше не требуется.