Ошибка при использовании заголовка с cmake и g++10C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Ошибка при использовании заголовка с cmake и g++10

Сообщение Anonymous »

Я использую стандартную библиотеку #include c++ в своем проекте cmake с c++20 и g++10 в Ubuntu 20.4 LTS

Код: Выделить всё

// properties.hpp
#include 
#include 
class File
{
private:
std::filesystem::path m_filePath;
public:
explicit File();
~File();
void setPath(const std::string &p_fullPath);
};

// properties.cpp
#include "properties.hpp"

ff::prop::File::File() { this->setPath(""); }
ff::prop::File::~File() { this->setPath(""); }

void ff::prop::File::setPath(const std::string &p_fullPath)
{
using namespace std::filesystem;
if (p_fullPath == "")
this->m_filePath = path();
else
this->m_filePath = path(p_fullPath);
}
Моя конфигурация CMake следующая: -

Код: Выделить всё

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)

### cmake settings
set(CXX_STANDARD_REQUIRED ON)
set(CXX_STANDARD 20)
set(CMAKE_CXX_COMPILER /usr/bin/g++-10)
cmake_language(GET_MESSAGE_LOG_LEVEL VERBOSE)
message("The c++ version is ${CXX_STANDARD} ${CMAKE_CXX_COMPILER}")

set(CMAKE_CXX_FLAGS_DEBUG_INIT "-Wall -Wextra -std=c++20")
set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Wall")

### project setttings
project(ff  VERSION 0.0.1  LANGUAGES CXX)

add_executable(${PROJECT_NAME}
app/main.cpp
app/src/app.cpp
app/src/properties.cpp
)
Когда я запускаю cmake -DCMAKE_BUILD_TYPE=Debug -S . -B debug Я получаю следующий вывод, подтверждающий, что версия компилятора работает на C++20: -

Код: Выделить всё

The c++ version is 20 /usr/bin/g++-10
-- Build spdlog: 1.11.0
-- Build type: Debug
-- Configuring done (0.3s)
-- Generating done (0.1s)
-- Build files have been written to: /home/projects/ff/debug
но когда я запускаю cmake --build debug/, я получаю следующие ошибки компоновщика: -

Код: Выделить всё

[ 50%] Building CXX object CMakeFiles/ff.dir/app/main.cpp.o
In file included from /home/projects/ff/app/headers/events/import.hpp:9,
from /home/projects/ff/app/headers/windows/file_win.hpp:12,
from /home/projects/ff/app/headers/windows/app_win.hpp:12,
from /home/projects/ff/app/headers/app.hpp:6,
from /home/projects/ff/app/main.cpp:1:
/home/projects/ff/app/headers/properties.hpp:27:18: error: ‘filesystem’ in namespace ‘std’ does not name a type
27 |             std::filesystem::path m_filePath;
|                  ^~~~~~~~~~
make[2]: *** [CMakeFiles/frameflow.dir/build.make:76: CMakeFiles/frameflow.dir/app/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:457: CMakeFiles/frameflow.dir/all] Error 2
make: *** [Makefile:136: all] Error 2
Я попробовал использовать #include с той же конфигурацией, изменив std::filesystem::path на std::experimental: :filesystem::path, что приводит к компиляции, но выдает ошибки компоновщика, поскольку он не может найти источник экспериментального файла.
Мои вопросы:
  • учитывая, что c++20 на g++10 поддерживает заголовок файловой системы, тогда почему он не компилируется
  • почему он компилируется с экспериментальной/файловой системой
  • что мне делать?
без минимального примера

Код: Выделить всё

// a.hpp
#pragma once
#include 
#include 

namespace ff::prop
{
class File
{
private:
std::filesystem::path m_filePath;
public:
explicit File();
~File();
void setPath(const std::string &p_fullPath);
};
} // namespace ff::prop

Код: Выделить всё

// a.cpp
#include "a.hpp"

ff::prop::File::File() { this->setPath(""); }
ff::prop::File::~File() { this->setPath(""); }

void ff::prop::File::setPath(const std::string &p_fullPath)
{
using namespace std::filesystem;
if (p_fullPath == "")
this->m_filePath = path();
else
this->m_filePath = path(p_fullPath);
}

Код: Выделить всё

// main.cpp
#include "a.hpp"

int main() {
ff::prop::File f();
return EXIT_SUCCESS;
}
Это при компиляции с g++-10 main.cpp a.cpp -o app -std=20компилируется.
Чтобы уточните: -
после запуска cmake --system-information info.txt я получаю следующее CMAKE_CXX_COMPILER == "/usr/bin/c++", но версия компилятора использует 10.3.0 в оба случая.

Подробнее здесь: https://stackoverflow.com/questions/764 ... ke-and-g10
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»