在 jemalloc.h 之前包含 std::mutex 时编译错误
Posted
技术标签:
【中文标题】在 jemalloc.h 之前包含 std::mutex 时编译错误【英文标题】:Compile errors when including std::mutex before jemalloc.h 【发布时间】:2015-02-26 01:04:27 【问题描述】:这个
//CSocket.h
#ifndef __SERVER_CSOCKET_H__
#define __SERVER_CSOCKET_H__
#include "winsock2.h"
#include "ws2tcpip.h"
#include <thread>
#include <stdio.h>
#include <string>
(cpp 仅包含标头)
//CSocket.cpp
#include "CSocket.h"
在 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ratio 中产生以下错误消息
ratio(122): error C2065: 'INTMAX_MAX': undeclared identifier
ratio(133): See reference to the instance of the just compiled class-template "std::ratio<_Nx,_Dx>".
ratio(124): error C2065: 'INTMAX_MAX': undeclared identifier
ratio(44): error C2065: 'INTMAX_MAX': undeclared identifier
ratio(217): See reference to the instance of the just compiled class-template "std::_Safe_mult<0x01,0x01>".
ratio(36): error C2338: integer arithmetic overflow
ratio(44): See reference to the instance of the just compiled class-template "std::_Safe_multX<0x01,0x01,false>".
ratio(44): error C2039: 'value': Is not an element of 'std::_Safe_multX<0x01,0x01,false>'
ratio(44): error C2065: 'value': undeclared identifier
ratio(44): error C2057: Expected constant expression
ratio(44): error C2039: 'value': Is not an element of 'std::_Safe_multX<0x01,0x0989680,false>'
ratio(219): error C2975: "_Nx": invalid template argument for "std::ratio", expected compile-time constant expression.
ratio(116): See declaration of '_Nx'
ratio(219): error C2975: "_Dx": invalid template argument for "std::ratio", expected compile-time constant expression.
ratio(117): See declaration of '_Dx'
CSocket.cpp
在 .cpp 中包含 std::thread 而不是在标头中可以解决所有错误,但我不知道为什么它在标头中不起作用。
//CSocket.cpp
#include "CSocket.h"
#include <thread>
我使用的唯一库是 jemalloc。 错误可能来自于在 mutex 之前包含 jemalloc.h 而不是来自线程本身?
【问题讨论】:
你能把这些信息翻译成英文吗? “在 .cpp 中包含 std::thread 而不是在标头中可以解决所有错误” - 在这种情况下,您是否在包含"CSocket.h"
之前包含它?
不,是的,我都尝试在 CSocket.h 中的所有其他包含之后和之前包含线程;)我添加了一些关于我尝试谷歌搜索问题的信息。
我无法重现此问题。请提供显示问题的最小源文件。 (我尝试使用您的第一个“源文件”,但编译成功。)
旁注:__SERVER_CSOCKET_H__
是保留标识符。
【参考方案1】:
我必须在#include "jemalloc.h"
之前#include <mutex>
而不是之后。
现在工作正常,但奇怪的错误。
【讨论】:
【参考方案2】:我遇到了同样的错误,但是包含的顺序对我没有用。我认为这与其他也使用 chrono 和 thread 的包含有关,因此您可以检查一下。
您使用的是 Visual Studio 吗?似乎更多人遇到了同样的错误:https://connect.microsoft.com/VisualStudio/feedback/details/800726/compiler-error
【讨论】:
是的,我正在使用 Visual Studio(使用 2013 Professional 更新 3 和 4 以及 Community 2013 对其进行了测试)。 我也在使用那个版本。也许我们应该将其发布在 Microsoft 支持页面上! 查看答案:***.com/questions/24798033/… 谢谢,我猜这很可能是我们问题的原因。 感谢您离开这里。有时环境、编译器等是一个重要的细节。对此,我真的非常感激。为你兄弟 +1。【参考方案3】:VS2013 update 3我也有同样的错误。问题似乎是INTMAX_MAX
没有定义,但在ratio.h中使用。
我的解决方案是添加
#define INTMAX_MAX INT64_MAX
在你的文件中#include <ratio>
之前(如果你没有该行,你可以添加它)。
可以在stdint.h
中找到要包含的行 - 在您的情况下,右侧可以不同。
PS 另一种解决方案是#include <stdint.h>
并定义__STDC_LIMIT_MACROS
。在这种情况下,您可能会收到一些关于重复宏的警告。
【讨论】:
【参考方案4】:当我使用 CxImage 作为第三方库并在 C++11 中使用线程池时,它会发生在项目中。单独它们都很好,虽然合并在同一个项目中,但会发生错误。
solution 是添加 _STDC_LIMIT_MACROS 的预编译选项到 属性页 -> 配置属性 -> C/C++ -> 预处理器 -> 项目的预处理器定义。
PS:我的环境是:MFC/VS2015 && windows7 64bit
可能对某人有帮助:)
【讨论】:
以上是关于在 jemalloc.h 之前包含 std::mutex 时编译错误的主要内容,如果未能解决你的问题,请参考以下文章
redis 安装报错 jemalloc/jemalloc.h: No such file or directory。
redis make时 提示 zmalloc.h:50:31: error: jemalloc/jemalloc.h:
zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目
zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目
编译 redis 报错 error: jemalloc/jemalloc.h: No such file or directory
In file included from adlist.c:34:0: zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录