【问题标题】:CLion CMake application cannot resolve mutexCLion CMake 应用程序无法解析互斥锁
【发布时间】:2021-11-20 07:32:49
【问题描述】:

我正在尝试在 Windows 中使用 CLion IDE 构建一个 c++ 项目。其中一个 cpp 文件包括mutex。但似乎 clion 找不到这个。它说

命名空间“std”中没有名为“mutex”的成员

显示此错误的代码 sn-p 是

typedef std::lock_guard<std::mutex> my_lock;
static std::mutex my_mutex_;

我的 CMakeLists.txt 文件包含

cmake_minimum_required(VERSION 3.20)
project(webrtc_aec)
FIND_PACKAGE(JNI REQUIRED)
include_directories(${JNI_INCLUDE_DIRS})
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1")

当我构建这个项目时,它会说。

错误:“mutex”不是“std”的成员

我不确定我做错了什么。我怎样才能摆脱这个错误?

编辑:当我构建这个时它也说

-DCMAKE_BUILD_TYPE=发布 -DCMAKE_DEPENDS_USE_COMPILER=FALSE -G "代码块 - MinGW Makefiles"

编辑 2: Logger 类的最小示例

Logger.h

#ifndef LOGGER_H
#define LOGGER_H

#include <cstdlib>
#include <fstream>
#include <string>
#include <ctime>
#include <mutex>
#include <condition_variable>
#include <sstream>
#include <iostream>

class Logger {
public:
    static void init(const char*);
    static void close();

    static void debug(std::string fileName, int lineNumber, const std::string& message);
    static void info(std::string fileName, int lineNumber, const std::string& message);
    static void warn(std::string fileName, int lineNumber, const std::string& message);
    static void error(std::string fileName, int lineNumber, const std::string& message);

private:
    static void log(std::string fileName, int lineNumber, const std::string& message, int type);
    static std::string timeString(time_t time, std::string format);

    static std::ofstream log_stream;
    
    static bool initialized;

    static const int DEBUG = 0;
    static const int INFO = 1;
    static const int WARN = 2;
    static const int ERR = 3;
};

#endif /* LOGGER_H */

Logger.cpp

#include "Logger.h"

/* DEFINITIONS BELOW */


typedef std::lock_guard<std::mutex> logger_lock;
static std::mutex logger_mutex_;
static const char* log_file;

std::string Logger::timeString(time_t time, std::string format) {
    char time_format_buffer[64];
    std::strftime(time_format_buffer, sizeof(time_format_buffer), format.c_str(), std::localtime(&time));
    return time_format_buffer;
}

void Logger::init(const char* file_name) {
    //std::cout << "Getting log file name\n";
    if (!initialized) {
        //std::cout << "Log file name: " << filename << std::endl;
        log_file = file_name;
        log_stream.open(log_file, std::ios::app);
        initialized = true;
    }
    else {
        Logger::log("Logger.cpp", __LINE__, "An attempt was made to reinitialize the logger!", Logger::WARN);
    }
}

void Logger::close() {
    if (initialized) {
        log_stream.close();
        initialized = false;
    }
    else {
        Logger::log("Logger.cpp", __LINE__, "An attempt was made to close an unititialized logger!", Logger::WARN); // This is stupid.
    }
}

void Logger::log(std::string fileName, int lineNumber, const std::string& message, int type) {
    std::string prefix, timestamp;

    switch (type) {
    case Logger::DEBUG:
        prefix = "[D ";
        break;
    case Logger::WARN:
        prefix = "[W ";
        break;
    case Logger::INFO:
        prefix = "[I ";
        break;
    case Logger::ERR:
        prefix = "[E ";
        break;
    default:
        prefix = "[? ";
    }

    timestamp = timeString(std::time(NULL), "%Y-%m-%d %H:%M:%S");
    logger_lock ll(logger_mutex_);
    log_stream << prefix << timestamp << " - " << fileName << ":" << lineNumber << "] - " << message << std::endl;
}

void Logger::debug(std::string fileName, int lineNumber, const std::string& message) {
    Logger::log(fileName, lineNumber, message, Logger::DEBUG);
}

void Logger::info(std::string fileName, int lineNumber, const std::string& message) {
    Logger::log(fileName, lineNumber, message, Logger::INFO);
}

void Logger::warn(std::string fileName, int lineNumber, const std::string& message) {
    Logger::log(fileName, lineNumber, message, Logger::WARN);
}

void Logger::error(std::string fileName, int lineNumber, const std::string& message) {
    Logger::log(fileName, lineNumber, message, Logger::ERR);
}

std::ofstream Logger::log_stream;
bool Logger::initialized = false;

【问题讨论】:

  • “其中一个 cpp 文件包含互斥锁”是什么意思?您在使用 std::mutex 的源文件中是否有 #include &lt;mutex&gt; 标头?
  • 是的。我做对了。
  • 我用的是windows
  • 我不确定。我该如何检查?
  • 它说... -DCMAKE_BUILD_TYPE=Release -DCMAKE_DEPENDS_USE_COMPILER=FALSE -G "CodeBlocks - MinGW Makefiles"

标签: c++ cmake clion


【解决方案1】:

"其中一个 cpp 文件包含互斥锁"

您的编译器告诉我们这还不够。在每个翻译单元中首次使用std::mutex之前必须包含&lt;mutex&gt;。仅供参考,翻译单元是 .cpp 及其直接或间接包含的任何内容。这意味着您自己的 .h 中甚至可能需要 #include &lt;mutex&gt;。这很常见,例如当 .h 中的类声明包含 std::mutex 成员时。

【讨论】:

  • 我尝试将 1. #include 放入 .h 文件 2. #include 放入 .cpp 文件 3. #include 在两个文件中。但仍然没有运气
  • @SodrulAminShaon:那么是时候举个小例子了。
  • 我已经编辑了我的问题并分享了我的记录器类
  • @SodrulAminShaon:这大约是最小的 50 倍。如果您的 .cpp 文件实际上只有 2 行,您会收到相同的错误消息吗? #include "Logger.h" static std::mutex logger_mutex_;。 ?也让你的 .h 最小化。
  • 是的,即使在 .cpp 和 #ifndef LOGGER_H #define LOGGER_H #include #include #endif /* LOGGER_H */ 中的 .h 文件中有 2 行,它也会显示同样的错误。
【解决方案2】:

正如@fabian 所说。我必须安装最新的MingW 。然后改变clion设置如下。

  1. 文件 -> 构建、执行、部署 -> 工具链 -> 添加(将新安装的 mingw 指向此处并将其设置为默认值)
  2. 文件 -> 构建、执行、部署 -> CMake ->(配置文件)发布 -> 工具链(确保新的 mingw 被指向)

这解决了我的问题。谢谢。 :)

【讨论】:

    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2012-12-25
    • 1970-01-01
    • 2022-07-31
    • 2015-09-26
    • 2010-11-22
    相关资源
    最近更新 更多