Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 我想用clang/clang++;通过使用cmake的正确程序检测叮当声_Linux_Ubuntu_Cmake_Clang_Llvm - Fatal编程技术网

Linux 我想用clang/clang++;通过使用cmake的正确程序检测叮当声

Linux 我想用clang/clang++;通过使用cmake的正确程序检测叮当声,linux,ubuntu,cmake,clang,llvm,Linux,Ubuntu,Cmake,Clang,Llvm,下面是我想做的 我想通过使用cmake的正确过程检测clang来使用clang/clang++进行编译 请告诉我解决我将要描述的问题的正确步骤 我执行了以下步骤,但无法正确检测 我刚才描述了CMakeLists.txt的检测部分 CMakeLists.txt function(display_vars vars prefix) message("${prefix}") foreach(IT ${vars}) message("${prefix}${IT} = ${${IT}}")

下面是我想做的

我想通过使用cmake的正确过程检测clang来使用clang/clang++进行编译

请告诉我解决我将要描述的问题的正确步骤

我执行了以下步骤,但无法正确检测

我刚才描述了CMakeLists.txt的检测部分

CMakeLists.txt

function(display_vars vars prefix)
  message("${prefix}")
  foreach(IT ${vars})
    message("${prefix}${IT} = ${${IT}}")
  endforeach()
endfunction()


include(CheckCXXCompilerFlag)

set(project_name clang-test)

project(${project_name})

find_package(LLVM REQUIRED CONFIG)

include_directories( ${LLVM_INCLUDE_DIRS} )
add_definitions ( ${LLVM_DEFINITIONS} )

enable_language(CXX)

# setup compile & link flags
check_cxx_compiler_flag(-std=c++17 COMPILER_SUPPORTS_CXX17)
check_cxx_compiler_flag(-std=c++1z COMPILER_SUPPORTS_CXX1Z)
check_cxx_compiler_flag(-std=c++14 COMPILER_SUPPORTS_CXX14)
check_cxx_compiler_flag(-std=c++1y COMPILER_SUPPORTS_CXX1Y)
check_cxx_compiler_flag(-std=c++11 COMPILER_SUPPORTS_CXX11)
check_cxx_compiler_flag(-std=c++0x COMPILER_SUPPORTS_CXX0X)

# setup compile & link flags
if(COMPILER_SUPPORTS_CXX17)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
elseif(COMPILER_SUPPORTS_CXX1Z)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z")
elseif(COMPILER_SUPPORTS_CXX14)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
elseif(COMPILER_SUPPORTS_CXX1Y)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y")
elseif(COMPILER_SUPPORTS_CXX11)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
  message(FATAL_ERROR "The compiler has no C++11 support.")
endif()


set(echo_vars)
# result by find_package(LLVM REQUIRED CONFIG) 
list(APPEND echo_vars LLVM_DIR LLVM_PACKAGE_VERSION LLVM_INCLUDE_DIRS LLVM_DEFINITIONS)
# detect environment
list(APPEND echo_vars 
  CMAKE_C_COMPILER_ID 
  CMAKE_C_STANDARD 
  CMAKE_CXX_COMPILER_ID 
  CMAKE_CXX_STANDARD
  CMAKE_CXX_FLAGS
  CMAKE_GNUtoMS 
  CMAKE_SYSTEM_NAME 
  CMAKE_COMPILER_IS_GNUC 
  CMAKE_COMPILER_IS_GNUCXX 
  CMAKE_COMPILER_IS_CLANG
  CMAKE_COMPILER_IS_MINGW 
  CMAKE_COMPILER_IS_CYGWIN
  CMAKE_GNU_COMPILER_ID 
  CMAKE_CLANG_COMPILER_ID)

display_vars("${echo_vars}" "env: ")


set(project_sources test.cpp)

add_executable(${project_name} ${project_sources})
test.cpp

#include <string_view>

int main(int argc, char** argv)
{
    return 0;
}


cmake -G "Unix Makefiles" ./
这将被检测到

CMAKE_COMPILER_IS_CLANG
CMAKE_CLANG_COMPILER_ID
自行构建的clang的安装路径是默认的/usr/local/

检测日志如下所示,仅检测到GCC

CMAKE_COMPILER_IS_CLANG
CMAKE_CLANG_COMPILER_ID
日志

日志中有如下消息,尽管它与主题不同

执行测试编译器\u支持\u CXX17-成功

此GCC(6 .0 2)仅支持C++ 1Z。 在gcc中,如下所示是正确的

CXX_FLAGS = -std=c++1z
env: CMAKE_CLANG_COMPILER_ID = 1
env: CMAKE_COMPILER_IS_CLANG = 1
我将把谈话转到主题上来

强制指定用于检测叮当声的编译器

cmake -G "Unix Makefiles" ./ -DCMAKE_C_COMPILER=/usr/local/bin/clang -DCMAKE_CXX_COMPILER=/usr/local/bin/clang++
新日志

CMake suite maintained and supported by Kitware (kitware.com/cmake).
-- The C compiler identification is Clang 6.0.0
-- The CXX compiler identification is Clang 6.0.0
-- Check for working C compiler: /usr/local/bin/clang
-- Check for working C compiler: /usr/local/bin/clang -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/local/bin/clang++
-- Check for working CXX compiler: /usr/local/bin/clang++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
env: 
env: LLVM_DIR = /usr/local/lib/cmake/llvm
env: LLVM_PACKAGE_VERSION = 6.0.0
env: LLVM_INCLUDE_DIRS = /usr/local/include
env: LLVM_DEFINITIONS = -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
env: CMAKE_C_COMPILER_ID = Clang
env: CMAKE_C_STANDARD = 
env: CMAKE_CXX_COMPILER_ID = Clang
env: CMAKE_CXX_STANDARD = 
env: CMAKE_CXX_FLAGS = -std=c++17
env: CMAKE_GNUtoMS = 
env: CMAKE_SYSTEM_NAME = Linux
env: CMAKE_COMPILER_IS_GNUC = 
env: CMAKE_COMPILER_IS_GNUCXX = 
env: CMAKE_COMPILER_IS_CLANG = 
env: CMAKE_COMPILER_IS_MINGW = 
env: CMAKE_COMPILER_IS_CYGWIN = 
env: CMAKE_GNU_COMPILER_ID = 
env: CMAKE_CLANG_COMPILER_ID = 
-- Performing Test COMPILER_SUPPORTS_CXX17
-- Performing Test COMPILER_SUPPORTS_CXX17 - Success
-- Performing Test COMPILER_SUPPORTS_CXX1Z
-- Performing Test COMPILER_SUPPORTS_CXX1Z - Success
-- Performing Test COMPILER_SUPPORTS_CXX14
-- Performing Test COMPILER_SUPPORTS_CXX14 - Success
-- Performing Test COMPILER_SUPPORTS_CXX1Y
-- Performing Test COMPILER_SUPPORTS_CXX1Y - Success
-- Performing Test COMPILER_SUPPORTS_CXX11
-- Performing Test COMPILER_SUPPORTS_CXX11 - Success
-- Performing Test COMPILER_SUPPORTS_CXX0X
-- Performing Test COMPILER_SUPPORTS_CXX0X - Success
它现在被检测到了

CMAKE_COMPILER_IS_CLANG
CMAKE_CLANG_COMPILER_ID
但是,上述变量仍然为空

让我们暂时编译一个简单的文件

将以下内容放在源文件的开头

#include <string_view>
尽管编译器是使用上述选项强制指定的,但它不会改变未正确检测到其他环境的情况

CMAKE_COMPILER_IS_CLANG
CMAKE_CLANG_COMPILER_ID
如果检测正确,系统包含路径应使用LLVM\u include\u DIRS=/usr/local/include.

另外,我认为CMAKE变量如下所示

CXX_FLAGS = -std=c++1z
env: CMAKE_CLANG_COMPILER_ID = 1
env: CMAKE_COMPILER_IS_CLANG = 1
通过强制设置此环境设置,它似乎遇到了麻烦

我认为,除非cmake正确地识别出clang,否则影响编译的环境变量将不会被正确地更改

这怎么可能呢

顺便说一下,当我们在以下环境中进行测试时

它只识别g++

如果安装了带有apt install clang等的软件包,是否会更新系统数据库中的某些内容

因为它是自建的,所以可能无法识别


请帮助我。

< P>如果你想要所有这些奇特的C++ 1Z特性,你不仅需要支持它的编译器,而且需要一个标准的C++库。Clang选择它找到的任何库,它恰好是GCC的库

尝试安装
libc++
并将
-stdlib=libc++
标志添加到
CMAKE\u CXX\u标志

env: CMAKE_CLANG_COMPILER_ID = 1
env: CMAKE_COMPILER_IS_CLANG = 1
OS   : Ubuntu 18.04 64bit
gcc  : gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
clang: 6.0.0 (self build)
cmake: 3.11.3
#include <string_view>
sudo update-alternatives --config c++