- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
下面是我想做的。
我想通过使用 cmake 的正确程序检测 clang 来使用 clang/clang++ 进行编译。
请告诉我可以解决我将描述的问题的正确程序。
test environment:
OS : Ubuntu 16.10 64bit
gcc : gcc (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005
clang: 6.0.0 (self build)
cmake: 3.11.3
我做了以下程序,但无法正确检测。
我刚刚描述了 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})
测试.cpp
#include <string_view>
int main(int argc, char** argv)
{
return 0;
}
cmake -G "Unix Makefiles" ./
执行该命令时,只检测到gcc,根本检测不到clang。
which clang
> /usr/local/bin
这将被检测到。
自建的clang安装路径默认为/usr/local/。
检测日志如下,只检测到GCC。
日志
CMake suite maintained and supported by Kitware (kitware.com/cmake).
-- The C compiler identification is GNU 6.2.0
-- The CXX compiler identification is GNU 6.2.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- 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/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- 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 = GNU
env: CMAKE_C_STANDARD =
env: CMAKE_CXX_COMPILER_ID = GNU
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 = 1
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
虽然与主题不同,但日志中有如下消息。
执行测试 COMPILER_SUPPORTS_CXX17 - 成功
这个 gcc (6.2.0) 只支持 c++ 1z。
在gcc中如下是正确的。
CXX_FLAGS = -std=c++1z
言归正传
强制指定用于检测 clang 的编译器。
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>
然后出现如下错误。
fatal error: 'string_view' file not found
#include <string_view>
^~~~~~~~~~~~~
1 error generated.
clang 6.0 支持 c++17,应该可以编译。
尝试将 include 更改为以下内容。
这是c++1z中string_view的路径。
#include <experimental/string_view>
如上描述即可成功编译。
我想过这是什么意思。
编译器是clang,但是系统包含路径是gcc使用的。
只能认为/usr/include/c++/6.2.0/experimental是在系统include路径中使用/usr/include引用的。
作为我的推理,
-DCMAKE_C_COMPILER=/usr/local/bin/clang -DCMAKE_CXX_COMPILER=/usr/local/bin/clang++
虽然上面的选项强制指定了编译器,但这并不改变没有正确检测到其他环境。
如果检测正确,系统包含路径应使用 LLVM_INCLUDE_DIRS =/usr/local/include。
此外,我认为 CMAKE 变量将如下所示。
env: CMAKE_CLANG_COMPILER_ID = 1
env: CMAKE_COMPILER_IS_CLANG = 1
似乎只是强行设置这个环境设置就麻烦了。
我认为除非cmake正确识别clang,否则影响编译的环境变量不会被正确更改。
这怎么可能?
顺便说一句,当我们在以下环境中进行测试时,
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>
本次编译成功
但是,也许使用的系统包含路径是/usr/include/。
编译成功,因为gcc已经正式对应c++17,experimental也没有了。
我试过另一个。
sudo update-alternatives --config c++
它只识别g++
如果使用 apt install clang 等安装软件包,系统数据库中的某些内容是否会更新?
因为是自建,所以可能无法识别。
请帮帮我。
最佳答案
如果您想要所有这些奇特的 c++1z 功能,您不仅需要支持它的编译器,还需要一个标准的 C++ 库。 Clang 会选择它找到的任何库,而它恰好是 GCC 的库。
尝试安装 libc++
并将 -stdlib=libc++
标志添加到 CMAKE_CXX_FLAGS
。
关于linux - 我想通过使用 cmake 的正确程序检测 clang 来使用 clang/clang++ 进行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50933490/
我知道的引用资料在这里: http://clang.llvm.org/docs/ClangCommandLineReference.html http://clang.llvm.org/docs/Di
这两个工具似乎有一些共同的目标,而 documentation of clang-tidy对其功能非常明确,clang-check's有点稀疏。 如果我只能运行这些工具中的一个,同时进行相同的检查,那
我不清楚 clang 使用的汇编器。 AFAIK native 又名 GNU 汇编器和链接器被使用(与 gcc 一起提供)。 clang -v main.c clang version 3.4.2 T
在哪里可以找到 Clang 标志的完整列表? 还有一些,例如 -include-pch,甚至没有在手册页中列出。 :( 我知道 GCC 使用一些相同的标志,但它不包含诸如 -Os 之类的文档,我相信这
大多数成熟的编译器似乎对堆栈变量破坏有很好的支持。 海湾合作委员会:-fstack-protector xlC: -qstackprotect 英特尔:-fstackprotector window
我的命令: /usr/bin/c++ -fPIC -I/Users/me/project/include -I/usr/local/include/opencv \ -I/usr/local/incl
我正在研究 CLang 3.5。我正在尝试获取有关在 C++ 项目中声明的变量的信息。 如何获取 clang::VarDecl 中变量的数据类型或限定类名, clang::FieldDecl或 cla
我正在尝试构建 LLVM 编译器,以便我可以在 Apple M1 上启用 OpenMP。 我正在使用 LLVM 开发树,(因为我最近看到一些 OpenMP 运行时对此进行了处理)。 我已经结束了这个脚
背景: 在 Windows 10 PC 上,我有一个 C++ 代码库。使用 CMAKE 我生成了一个 Mingw-w64 项目(使用 Eclipse IDE)和一个 Visual Studio 201
下面是我想做的。 我想通过使用 cmake 的正确程序检测 clang 来使用 clang/clang++ 进行编译。 请告诉我可以解决我将描述的问题的正确程序。 test environment:
基本问题 我有以下代码 #include #include using namespace std; int main () { int32_t spam; spam=5; cout
当我在xcode中编译.c文件时,出现错误提示: clang error: argument unused during compilation: '-fno-objc-exceptions' [-W
Clang has several kinds of diagnostics ,其中三种主要是错误、警告和注释。 注释通常伴随着某些警告和错误,例如重复定义: error: conflicting t
我正在调整 Clang 工具模板(如 here 所述)以在我的代码中搜索特定的方法调用。为了稍后重写该调用,我想获取调用该方法的参数的类型,以及调用该方法的对象的类型。 我设法找到了一个可以回调以下内
我必须通过在它之前添加一个语句来检测 clang 中的某些语句。我有一个指向 Expr 对象的指针,我需要在包含它的语句之前插入另一个语句。现在我正在使用一种hacky方法,它只是将 SourceLo
类 clang::ASTContext 有一个方法: DynTypedNodeList getParents(const NodeT &Node) 它返回给定 AST 节点的父节点列表。 通常 AST
我想修改代码分析器程序clang-tidy的检查正在做,但是好像是配置文件.clang-tidy的内容正在被忽视。 我通过调用 clang-tidy 创建文件带旗-dump-config并将输出重定向
有没有办法用clang创建一个可以合理地适合页面的调用图? 即给出: #include using namespace std; int main() { int a; cin>>a;
我正在编写一个 Clang 工具,并且试图弄清楚如何在访问程序 AST 的情况下评估字符串文字。给定以下程序: class DHolder { public: DHolder(std::strin
我想在 Clang 中尝试一些新功能,有人提到我 Clang TOT . 现在这可能是一个明显的问题,到底是什么Clang TOT . TOT 一定是一些我不熟悉的首字母缩写词。 任何人都可以启发我吗
我是一名优秀的程序员,十分优秀!