在处理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电话.
我的问题是:
为什么模块会阻止tgmath正确导入?
有没有办法解决它并同时使用tgmath和模块?我仍然希望能够使用它们.
我想了解哪些版本的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在Fedora 20上编译简单的hello world,我得到以下输出:
d.cpp:1:10:致命错误:找不到'iostream'文件
#include <iostream>
我不知道如何解决它.
我写了一篇详细的教程,其中包含了这个问题的前两个答案:http://blog.johannesmp.com/2015/09/01/installing-clang-on-windows-pt1/
在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) 我正在尝试使用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.
我使用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'
我正在尝试使用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如何检测工具链是否存在?
给出以下示例代码:
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++中是不合法的.所描述的互斥锁与变量的绑定不存在.问题是如何实现或实现相同的效果.
我刚刚在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误解了文档?
在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.为什么要这么做?它有什么不同?难道这个强制编译器不会替换,比方说,true用true?