标签: llvm-clang

如果启用了模块,则tgmath.h不起作用

在处理arm64时,我考虑使用它tgmath.h来处理CGFloat typedef float/double混乱.

这个答案对如何使用它有很好的描述,除了它对我来说根本不起作用.无论如何,我的代码仍在调用math.h函数.

在花了一些时间查看所有项目编译器设置后,我发现禁用"模块"功能(@import vs #import - iOS 7)使一切正常.更具体地说,在项目设置中的选项被称为Enable Modules(C and Objective-C)Apple LLVM 5.1 - Language - Modules下拉列表中.

要查看此问题的快速示例,请下载使用tgmath的项目,例如MBProgressHUD,并查看启用模块项目设置时会发生什么.该tgmath.h呼叫会被替换成普通math.h电话.

我的问题是:

  1. 为什么模块会阻止tgmath正确导入?

  2. 有没有办法解决它并同时使用tgmath和模块?我仍然希望能够使用它们.

macos objective-c llvm-clang ios

69
推荐指数
1
解决办法
2878
查看次数

获取Apple clang版本和相应的上游LLVM版本

我想了解哪些版本的clang Apple安装在我的macbook中,可以看到c ++ 11和/或c ++ 14的功能.我输入了这个命令:

clang --version

//----response
Apple LLVM version 7.0.0 (clang-700.1.76)     
Target: x86_64-apple-darwin15.0.0    
Thread model: posix
Run Code Online (Sandbox Code Playgroud)

但我无法理解什么(clang-700.1.76)意思.如何将此代码转换为clang版本?

这是您可以检查clang版本http://clang.llvm.org/cxx_status.html中提供的c ++功能的站点.

clang llvm-clang c++11 c++14 c++17

61
推荐指数
6
解决办法
4万
查看次数

Clang看不到基本标题

我试图用Clang在Fedora 20上编译简单的hello world,我得到以下输出:

d.cpp:1:10:致命错误:找不到'iostream'文件

#include <iostream>

我不知道如何解决它.

c++ clang llvm-clang c++11 clang++

46
推荐指数
5
解决办法
6万
查看次数

你需要安装什么来在Windows上使用Clang来构建64位的c ++ 14?

更新:

我写了一篇详细的教程,其中包含了这个问题的前两个答案:http://blog.johannesmp.com/2015/09/01/installing-clang-on-windows-pt1/



TL; DR

在Windows上,给出以下程序:

#include <iostream>

int main()
{
    int arr[] = {1, 2, 3, 4, 5};
    for(auto el : arr)
    {
        std::cout << el << std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望能够做到以下几点:

clang++ hello.cpp -o hello.exe -std=c++14
Run Code Online (Sandbox Code Playgroud)

并得到一个64位可执行文件,只是工作.我不想附加大量的-I包含来告诉clang在哪里找到iostream或其他标准的c ++标题; 我不想在多个步骤中进行链接.

我不太关心性能,效率,使用什么链接器等等.我只是想能够让clang/gcc /无论设置正确,以便我可以使用单个,快速和脏的控制台命令,如上面的一个.

我需要安装什么才能正常工作


问题

作为一个主要的mac/linux用户,我习惯于只使用包管理器来安装最新版本的clang,这只是有效的.

我现在正试图在Windows上设置clang/gnu编译器,这似乎要困难得多,如果只是因为那里几乎没有简单的文档(我已经能够找到)

我试过按照这个教程:https://yongweiwu.wordpress.com/2014/12/24/installing-clang-3-5-for-windows - 并且能够使用它来获得构建和链接的clang (使用gcc 4.8.2),但生成的二进制文件是32位.

我已经尝试安装最新的prengilt clang(3.6.2)和64位版本的mingw-w64(4.9.3用64位posix和sjlj用于例外),我得到:

hello.cpp:1:10: fatal error: 'iostream' file not …
Run Code Online (Sandbox Code Playgroud)

windows gcc llvm-clang c++11 clang++

45
推荐指数
2
解决办法
3万
查看次数

clang:没有外联虚拟方法定义(纯抽象C++类)

我正在尝试使用Clang-3.5编译以下简单的C++代码:

test.h:

class A
{
  public:
    A();
    virtual ~A() = 0;
};
Run Code Online (Sandbox Code Playgroud)

test.cc:

#include "test.h"

A::A() {;}
A::~A() {;}
Run Code Online (Sandbox Code Playgroud)

我用来编译它的命令(Linux,uname -r:3.16.0-4-amd64):

$clang-3.5 -Weverything -std=c++11 -c test.cc
Run Code Online (Sandbox Code Playgroud)

而我得到的错误:

./test.h:1:7: warning: 'A' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Wweak-vtables]
Run Code Online (Sandbox Code Playgroud)

任何暗示为什么会发出警告?虚拟析构函数根本没有内联.恰恰相反,test.cc中提供了一个外联定义.我在这里错过了什么?

编辑

我不认为这个问题是重复的: clang的-Wweak-vtables是什么意思? 正如FilipRoséen所说.在我的问题中,我特别提到纯抽象类(在建议的副本中没有提到).我知道如何-Wweak-vtables使用非抽象类,我很好.在我的例子中,我在实现文件中定义了析构函数(它是纯抽象的).这应该可以防止Clang发出任何错误,即使是-Wweak-vtables.

c++ clang llvm-clang clang++

34
推荐指数
3
解决办法
2万
查看次数

Clang C++交叉编译器 - 从Mac OS X生成Windows可执行文件

我使用Clang编译器在Mac上使用Xcode创建了一个C++应用程序.

我想编译我的源文件来创建一个可以在Windows机器上运行的可执行文件但是我不能让Clang生成一个可执行文件.

这是我尝试过的:

clang++ -std=c++11 -stdlib=libc++ -arch x86_64 class1.cpp class2.cpp... -o executable.exe
Run Code Online (Sandbox Code Playgroud)

这会创建一个可执行文件,但这不会运行(Windows给我一个错误,该应用程序是16位 - 不明白这一点 - 不能运行64位)

clang++ -std=c++11 -stdlib=libc++ -target i386-pc-win32 class1.cpp class2.cpp 
Run Code Online (Sandbox Code Playgroud)

出于某种原因,每当我使用该-target标志时,我得到一个错误,指出编译器无法找到<iostream>标头,但是任何其他时间它都不会呻吟.
我尝试过使用-Ipath/to/iostreamfolder/但是这并没有产生任何更好的结果

任何建议都会很棒!谢谢!

我也试过了'-triple x86-pc-win32'旗帜,但是我得到了这个警告clang: warning: argument unused during compilation: '-triple x86-pc-win32'

c++ windows macos clang llvm-clang

32
推荐指数
3
解决办法
3万
查看次数

MAC OS X上的Eclipse不检测LLVM工具链

我正在尝试使用eclipse来使用LLVM/Clang在MAC OSX上编译/调试C/C++应用程序.

我知道我已经正确安装了工具链,因为我可以使用makefile从终端编译它,并且在运行clang -v时我正确地获得了LLVM版本+安装目录.

我下载了eclipse C++(Mars)+的新副本,安装了LLVM支持插件并遵循: 无法为Eclipse CDT安装LLVM工具链

将install dir路径从clang -v输出复制到preferences-> c ++> LLVM中的LLVM部分,但似乎eclipse没有检测到工具链.

除非我取消选中"仅显示目标上支持的工具链"复选框,否则在创建新的C++项目时它不会显示为选项,当我取消选中它并在构建过程中为MACOS创建LLVM项目时,它会说:

未检测到"Toolchain"LLVM with Clang(MacOSX)".请参阅"C/C++开发用户指南","开始之前"如何安装工具链."

在手册中,它说的是安装Xcode以使工具链运行,这显然是因为它在终端上工作.

有任何想法吗 ?Eclipse如何检测工具链是否存在?

eclipse macos llvm-clang

28
推荐指数
1
解决办法
891
查看次数

将互斥锁绑定到对象

给出以下示例代码:

int var;
int mvar;
std::mutex mvar_mutex;

void f(){
    mvar_mutex.lock();
    mvar = var * var;
    mvar_mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)

我想表达它mvar_mutex绑定到变量mvar并仅保护该变量.mvar_mutex不应该保护,var因为它不受约束.因此,允许编译器将上面的代码转换为以下代码:

int var;
int mvar;
std::mutex mvar_mutex;

void f(){
    int r = var * var; //possible data race created if binding is not known
    mvar_mutex.lock();
    mvar = r;
    mvar_mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)

这可能会减少锁定上的争用,因为在保持锁定时工作量较少.

为此int可以使用std::atomic<int> mvar;和删除mvar_mutex,但对于其他类型,std::vector<int>这是不可能的.

如何以C++编译器理解并进行优化的方式表达互斥变量绑定?对于未绑定到该互斥锁的任何变量,应该允许在互斥锁边界上向上或向下重新排序任何变量

由于代码是使用生成的,clang::ASTConsumer并且clang::RecursiveASTVisitor我愿意使用非标准扩展和AST操作,只要clang(理想情况下是clang 4.0)支持它们并且生成的代码不需要优雅或人类可读.

编辑,因为这似乎导致混淆:上述转换在C++中是不合法的.所描述的互斥锁与变量的绑定不存在.问题是如何实现或实现相同的效果.

c++ multithreading llvm-clang c++14

23
推荐指数
3
解决办法
1050
查看次数

如何指定clang格式文件?

我刚刚在Redhat 6机器上构建了clang 5.0.0并尝试运行clang-format.我无法获得样式文件中的-style选项.这是我认为应该工作的一组命令的示例:

./clang-format -style=llvm -dump-config > .llvm-format
./clang-format -style=.llvm-format ~/myFile.cc
Run Code Online (Sandbox Code Playgroud)

当我运行此命令时,我收到以下错误:

Invalid value for -style
Run Code Online (Sandbox Code Playgroud)

当它按预期放在父目录中时,它似乎找到并使用.clang格式.内置类型也有效:

./clang-format -style=Mozilla ~/myFile.cc
Run Code Online (Sandbox Code Playgroud)

那么问题是我无法明确指定要使用的.clang格式文件.这是我的构建问题还是我滥用clang-format oir误解了文档?

c++ llvm clang llvm-clang clang-format

18
推荐指数
2
解决办法
1万
查看次数

#define XX在C中有什么影响?

在LLVM项目的源代码中stdbool.h,它显示为:

/* Don't define bool, true, and false in C++, except as a GNU extension. */
#ifndef __cplusplus
#define bool _Bool
#define true 1
#define false 0
#elif defined(__GNUC__) && !defined(__STRICT_ANSI__)
/* Define _Bool, bool, false, true as a GNU extension. */
#define _Bool bool
#define bool  bool
#define false false
#define true  true
#endif
Run Code Online (Sandbox Code Playgroud)

在最后4行中有三行from #define X X.为什么要这么做?它有什么不同?难道这个强制编译器不会替换,比方说,truetrue

c c++ llvm llvm-clang

17
推荐指数
2
解决办法
2595
查看次数

标签 统计

llvm-clang ×10

c++ ×6

clang ×5

c++11 ×3

clang++ ×3

macos ×3

c++14 ×2

llvm ×2

windows ×2

c ×1

c++17 ×1

clang-format ×1

eclipse ×1

gcc ×1

ios ×1

multithreading ×1

objective-c ×1