【发布时间】: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 <mutex>标头? -
是的。我做对了。
-
我用的是windows
-
我不确定。我该如何检查?
-
它说... -DCMAKE_BUILD_TYPE=Release -DCMAKE_DEPENDS_USE_COMPILER=FALSE -G "CodeBlocks - MinGW Makefiles"