首页 > 解决方案 > 错误:命名空间“std”gcc-7 中没有名为“invoke_result_t”的类型

问题描述

我的 cmake 文件:

cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_COMPILER "gcc-7")


project(invertedindex)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wconversion -O0")

set(SOURCE_FILES main.cpp inverted_index.hpp params.hpp)
add_executable(invertedindex ${SOURCE_FILES})

幸运的是我查看了生成的编译器命令

/usr/local/bin/gcc-7    -Wall -Wextra -Wconversion -O0   -std=gnu++1z -o CMakeFiles/invertedindex.dir/main.cpp.o -c /Users/adam/school/cpp/invertedindex/main.cpp

看到了-std=gnu++1z。我没有兴趣长时间研究这他妈的是什么以及为什么当我有

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

它怀疑 -std=gnu++1z 不是一个稳定的、已完成的库或某事。但是 gcc 7 支持 c++17 标准的大部分特性。

当我害怕知道它应该工作时,我手动将生成的命令参数替换为-std=gnu++17并且它工作了。怎么了?如何让它在 cmake 中工作?

标签: c++cmakec++17

解决方案


请参阅如何在 cmake 中指定编译器 我使用的是第三种方法,它标有避免。第一种方法,即设置CXXenv var 不起作用(编译器是一些 Mac g++)。所以我尝试了第二种方法 - 在 cmake args 中指定编译器-D CMAKE_C_COMPILER=gcc-7,它有效。即使再次生成 c++1z 参数。我不明白它,但直到我打破我很好。

/usr/local/bin/gcc-7    -Wall -Wextra -Wconversion -O0 -g   -std=gnu++1z -o CMakeFiles/invertedindex.dir/main.cpp.o -c /Users/adam/school/cpp/invertedindex/main.cpp

推荐阅读