有关clang LLVM编译器前端的问题。有关C的一般问题,请使用C标记。
我想学习汇编,我认为将 C 代码编译为汇编将是一个好的开始。也就是说: cc main.c -S 编译 #包括 int main() { printf("...
从 WinLib 安装最新的 GCC 和 Clang 会导致缺少 dll 错误
我发现由于某种奇怪的原因,安装最新的 WinLib 二进制文件会导致 clang 无法工作(版本“GCC 14.1.0(带有 POSIX 线程)+ LLVM/Clang/LLD/LLDB 18.1.5 + MinGW-w64 11.0”)。 1 (...
“-target arm64-apple-ios9999”中的版本号无效
Xcode 昨天自动更新,现在我无法再构建我的应用程序了。 Xcode版本是15.4 铿锵版本是15.0.0 当我尝试运行/构建应用程序时,这是我收到的错误: Xcode 昨天自动更新,现在我无法再构建我的应用程序了。 Xcode版本是15.4 clang版本是15.0.0 当我尝试运行/构建应用程序时,这是我得到的错误: <project folder>/clang:1:1 invalid version number in '-target arm64-apple-ios9999' 就是这样。最奇怪的部分是那里的 9999 数字,我在代码中找不到它,一定是 Xcode 正在设置的东西。 我尝试运行softwareupdate --all --install --force但没有成功(它最终更新了我的MacOS,但仍然是同样的错误)。 更新 从 Xcode 15.3 安装并运行效果很好。 我使用的是 Sentry 8.24.0,升级到 8.26.0 为我解决了这个问题。
我正在尝试获取指令的操作数名称,例如%10 = load i32* %2,align 4,!dbg!140'。但是,它为名为 %1、%2 的操作数提供了空字符串',如下所示。 那里...
如何让编译器发出有关 switch 和 case 中枚举类型不匹配的警告?
对于下面的代码,我希望有一个警告,因为a是枚举A类型,但是case B1和B2是枚举B类型;但我找不到一种方法让 gcc/clang 发出警告。 关于如何做的任何建议
clang:加载共享库时出错:libtinfo.so.5:无法打开共享对象文件:没有这样的文件或目录
我正在从 https://github.com/substratum/template 构建一个底层主题 我在运行时遇到以下错误: 构建命令失败。 执行进程 /home/anubhav/Android/Sdk/... 时出错
为什么这个运算符重载可以在 MSVC 和 GCC 中编译,但不能在 Clang 中编译?
我正在尝试创建一个strong_alias包装类型,它可以与原始类型互换,但不能与其他strong_alias互换。 #包括 #包括 模板 我正在尝试创建一个 strong_alias 包装类型,它可以与原始类型互换,但不能与其他 strong_aliases 互换。 #include <array> #include <stdint.h> template <typename T, typename tag> requires std::is_arithmetic<T>::value class strong_alias { public: using type = T; constexpr strong_alias() : _value{} { } template <typename other> requires std::is_arithmetic<other>::value constexpr strong_alias(const other &set_value) : _value{T(set_value)} { } constexpr T &value() { return _value; } constexpr const T &value() const { return _value; } template <typename other> requires std::is_arithmetic<other>::value constexpr operator other() const { return other(value()); } constexpr bool operator==(const strong_alias &rhs) const { return value() == rhs.value(); } constexpr strong_alias operator*(const strong_alias &rhs) const { return value() * rhs.value(); } private: T _value; }; using A = strong_alias<int8_t, struct A_tag>; static_assert(std::is_assignable<A, A>()); static_assert(std::is_assignable<A, int>()); static_assert(std::is_assignable<int &, A>()); using B = strong_alias<int8_t, struct B_tag>; static_assert(not std::is_assignable<A, B>()); static_assert(not std::is_assignable<B, A>()); static_assert(A(-3) == A(3) * -1); // builds with MSVC and GCC but not Clang int main() { } 上面的代码可以使用 MSVC (/std:c++latest) 和 GCC (-std=c++2c) 进行编译,但不能使用 Clang (-std=c++2c) 进行编译。 这里有编译器资源管理器演示。 哪些编译器能够正确处理这段代码?在 Clang 下使其工作的首选方法是什么? Compiler Explorer 的 Clang 输出: <source>:61:29: error: use of overloaded operator '*' is ambiguous (with operand types 'A' (aka 'strong_alias<signed char, A_tag>') and 'int') 61 | static_assert(A(-3) == A(3) * -1); // builds with MSVC and GCC but not Clang | ~~~~ ^ ~~ <source>:43:25: note: candidate function 43 | constexpr strong_alias operator*(const strong_alias &rhs) const | ^ <source>:61:29: note: built-in candidate operator*(float, int) 61 | static_assert(A(-3) == A(3) * -1); // builds with MSVC and GCC but not Clang | ^ <source>:61:29: note: built-in candidate operator*(double, int) <source>:61:29: note: built-in candidate operator*(long double, int) <source>:61:29: note: built-in candidate operator*(int, int) [...many lines omitted...] <source>:61:29: note: built-in candidate operator*(unsigned long long, unsigned long) <source>:61:29: note: built-in candidate operator*(unsigned long long, unsigned long long) <source>:61:29: note: built-in candidate operator*(unsigned long long, unsigned __int128) 1 error generated. Compiler returned: 1 首先,我们应该在重现问题的同时尽可能地简化代码。令人失望的是,OP 似乎没有做出任何尝试这样做。这是最小化版本: #include <type_traits> struct A { A(int set_value) : _value{set_value} { } template <typename other> requires std::is_arithmetic<other>::value operator other() const { return other(_value); } A operator*(const A &rhs) const { return _value * rhs._value; } int _value = 0; }; int main() { (void)(A(3) * -1); } 现在,这个*可以有几种不同的解释方式。它可以是 A::operator*,可通过第二个操作数从 int 到 A 的隐式转换来调用,也可以是内置算术 operator*,可通过第一个操作数的隐式转换来调用操作数从 A 到算术类型(可能第二个操作数也经历到不同算术类型的隐式转换)。 Clang 可以帮助打印出所有候选人。 之所以不明确,是因为当调用operator*时,我们得到了与第一个参数类型的精确匹配以及与第二个参数类型的用户定义转换。当调用内置的 operator*(int, int) 时,我们得到一个用户定义的转换,其第一个参数类型与第二个参数类型完全匹配。所以这两个候选人都不比另一个更好。 叮当是正确的。至于如何编译原始代码,由于问题是由两个候选代码引起的,每个候选代码都可以通过不同的隐式转换实现,因此您的选择基本上是: 提供比所有当前现有候选更好的您自己的重载,例如,一个 operator*,其第一个参数类型为 const strong_alias&,第二个参数类型为算术类型,或者 将 A 的转换构造函数更改为显式,或者 将转换函数 (A::operator other) 更改为显式,或者 以上任意组合 我无法告诉您哪个选项最适合您。这取决于您希望您的类型提供的 API。 GCC 和 MSVC 之所以不认为它含糊不清,可能与他们使用不同的算法来确定哪些内置运算符是候选者有关。在这种特殊情况下,他们只是给出了错误的答案,但更普遍的是,该标准没有就如何在其他可能涉及无限的初始候选者的情况下缩小一组相关内置候选者的范围提供足够的指导。请参阅CWG2844。
clang(和 LLVM)和 gcc / g++ 有什么区别?
gcc 和 g++ 是 C 和 C++ 代码的传统 GNU 编译器。最近,使用 LLVM 的 clang(和 clang++)作为替代编译器越来越受欢迎。 CLASS 和 CLASS 有什么区别
为什么 Clang 中删除了 to_chars 和 from_chars 函数
我尝试编译我的代码,但 charconv 头文件中的以下函数(即使它没有 .h 扩展名)无法编译,因为它们已在我使用的 Clang 版本中被删除: ...
我基本上不懂clang的-Wweak-vtables。以下是我迄今为止观察到的情况: 情况一:(触发警告) A类{ 民众: 虚拟 ~A(){} }; B 类:公共 A {
我在 MacOS Ventura 上的 clang++ 中链接 std::experimental::simd 操作时遇到问题。这是我最小的失败: #包括 使用 std::experimental::simd; int main(...
在我的项目中,我将许多函数的返回值从布尔值更改为枚举值。 问题出在整合上。编译器不会警告我错误使用这些函数。 我正在使用...
尝试用 clang 静态链接 libc,ldd 显示动态链接?
我想编译一个带有静态链接的系统库(例如 libc)和动态链接的所有其他自定义库(例如 openssl)的 C 程序。当我编译“Hello World&q...
以下包含嵌套三元语句的“C”源代码无法使用我的 RecursiveASTVisitor 使用 libTooling 的 clang::Rewriter 正确重写。 我不明白为什么会这样......
确保您的 PATH 中有 llvm-symbolizer 或设置环境变量 LLVM_SYMBOLIZER_PATH 指向它 - 退出代码 139
就我而言,我正在尝试使用 emscripten 构建一个库(开放级联)。 我必须使用特定版本的 Emscripten (3.1.39),所以 clang 版本是 13。 我使用的是Ubuntu 22 日志: [ 0%] 建造...
使用引导编译器与使用系统工具构建的相同编译器相比有什么好处?
我一直在一个古老的 Linux 发行版上尝试最新版本的 clang,使用系统提供的 gcc7 构建最新版本的 llvm 项目。这对于...
我想使用 clang-format 将 C/C++ 文件转储到磁盘中。我现在正在使用这个命令: clang格式的文件.c 重新格式化以下源代码片段: int main() { 字符名称[50]; int 我...
我最近听说 GCC 和其他编译器中对 C/C++ 的标签作为值扩展。我正在考虑如何使用它来编写线程解释器(其中虚拟机程序是
我只是在 Windows 上构建 clang。为了使其更加完整,似乎还应该制作编译器 lldb。 如何使用 mingw 构建 lldb?或者应该用 clang 构建?
使用 gcc 4.8 构建时如何检测是否使用地址清理器构建?
我正在开发一个用 C 编写的程序,我偶尔会使用地址清理程序来构建该程序,主要是为了捕获错误。该程序启动时会在日志中打印一条横幅,其中包含以下信息:who bui...