草庐IT

c - 对于 C 开发人员,Clang 版本 2.8 和 3.1 之间有什么实际区别?

我将专门使用C语言工作。Ubunutu10.10将从其存储库中检索Clang2.8版并完全安装它。我已经从源代码编译了Clangv3.1并将其添加到路径中(在卸载Clang2.8之后),但是无法通过这种方式访问​​它的手册页,并且偶尔会有一种关于没有完全“安装它”的唠叨感觉,虽然它在某些测试中似乎功能齐全。从C开发人员(实际上是学生)的角度来看,2.8版和3.1版之间有什么实际区别吗?我只在C中工作,不会利用它的C++或objective-c功能。我相信最近Clang的大部分开发都在扩展它的C++功能。 最佳答案 我发现的显着差异是

c - gcc/clang 如何假定字符串常量的地址是 32 位的?

如果我编译这个程序:#includeintmain(intargc,char**argv){printf("helloworld!\n");return0;}对于x86-64,asm输出使用movl$.LC0,%edi/callputs.(Seefullasmoutput/compileoptionsongodbolt.)我的问题是:GCC如何知道字符串的地址可以放入32位立即操作数?为什么不需要使用movabs$.LC0,%rdi(即movr64,imm64,不是零或符号扩展的imm32)。AFAIK,没有什么说加载程序必须决定在任何特定地址加载数据部分。如果字符串存储在1ULL以上

c++ - Clang/GCC 真的支持延迟加载功能吗?

如果您有真实经历与上述标题相关的内容,您是否介意对此发表评论?我试图在Ubuntu上使用Clang和GCC延迟加载一个共享对象(我实际上不介意使用哪个编译器),但它们看起来并不真正支持任何延迟加载功能(我期望延迟加载功能在父对象中放置一个stub,该对象试图在需要功能时按需加载另一个对象,但实际上并没有)。以下命令显示我试图将libbar.so延迟加载到libfoo.so:clangbar.c-fPIC-shared-olibbar.soclangfoo.c-Wl,-zlazy,lL'/path/to/where/lib/is',-lbar-ofoo如果libbar.so不存在,您将看

c - 这种对 int64_t 的处理是 GCC 和 Clang 错误吗?

现在,你们中的一些人可能会想大喊未定义的行为,但是有一个问题。int64_t类型不是由C标准定义的,而是由POSIX定义的.POSIX将此类型定义为:asignedintegertypewithwidthN,nopaddingbits,andatwo's-complementrepresentation.它不会将此留给实现来定义,而且绝对不允许将其视为无界整数。linux$catx.c#include#include#includeintstupid(int64_ta){return(a+1)>a;}intmain(void){intv;printf("%d\n",v=stupid(I

clang 中的代码覆盖率

我正在尝试为在DebianLinux上使用clang编译的小型C程序生成代码覆盖率文件。这是我所做的:neuron@debian:~/temp$lsmain.ctest.ctest.hneuron@debian:~/temp$clang*.cneuron@debian:~/temp$./a.out0这完全符合预期,我可以编译和运行东西。现在尝试启用覆盖。neuron@debian:~/temp$clang--coverage*.c/usr/bin/ld:cannotfind/usr/bin/../lib/libprofile_rt.a:Nosuchfileordirectoryclan

c - 尝试将 GCC 特定的 asm goto 移植到 Clang

我一直在尝试将一些GNU扩展转换为实际的标准C,以便它可以在clang上运行,知道标准C而不是GNU扩展,我有点不知所措。__asm__(goto("1:"STATIC_KEY_INITIAL_NOP".pushsection__jump_table,\"aw\"\n\t"_ASM_ALIGN"\n\t"_ASM_PTR"1b,%l[l_yes],%c0\n\t"".popsection\n\t"::"i"(key)::l_yes););我试图将其转化为实际的asm,但尚未成功。如果您好奇的话,除了那一部分之外,这是我即将在clang上构建的内核的一部分。

Linux 中的 Clang block ?

Clang有一个非常酷的扩展名为block将真正的lambda函数机制引入C。与block相比,gcc的嵌套函数非常有限。但是,尝试编译一个简单的程序c.c:#includeintmain(){void(^hello)(void)=^(void){printf("Hello,block!\n");};hello();return0;}使用clang-fblocksc.c,我得到了/usr/bin/ld.gold:/tmp/cc-NZ7tqa.o:infunction__block_literal_global:c.c(.rodata+0x10):error:undefinedrefer

linux - clang 3.8+ -fopenmp 在 Linux 上 : ld cannot find -lomp

我已经从DebianJessie和Fedora24的基础存储库中安装了clang3.8。当我尝试使用clang++编译一个简单的HelloWorld.cpp测试程序时,我传递了-fopenmp标志,在这两种情况下我得到了相同的结果错误:/usr/bin/ld:找不到-lompclang-3.8:错误:链接器命令失败,退出代码为1(使用-v查看调用)我看到如果我改为传递-fopenmp=libgomp,它就可以工作。但是,ClangOpenMP网站表示OpenMP运行时随Clang3.8一起提供。那么,为什么它找不到默认的libomp库呢?我在我的系统上的任何地方都看不到这个库。

c++ - 在 Linux 上为 clang 构建 libc++ 的认可方法是什么?

编辑/更新/注意:让clang使用libstdc++。到目前为止,对我来说效果很好。===============================以前我用cmake做一些事情就成功了,但是现在我在lib中发现了一个buildit脚本http://llvm.org/svn/llvm-project/libcxx/trunk项目树的目录。这个buildit脚本似乎没有使用libsupc++,而我之前采用的cmake方法正是使用了这种方法。例如,thisguide显示了一个cmake咒语来为libc++生成一个makefile,它将能够负责编译和安装。我的问题是,这些生成LLVM-libc+

c++ - Clang 的 UBSan 和函数指针 : Is this illegal?

我正在尝试通过一个函数指针表调用一些C++函数,该函数指针表作为C符号从共享对象中导出。该代码实际上可以正常工作,但Clang的未定义行为sanitizer(=UBSan)认为我进行的调用是非法的,如下所示:==11410==WARNING:Tryingtosymbolizecode,butexternalsymbolizerisnotinitialized!path/to/HelloWorld.cpp:25:13:runtimeerror:calltofunction(unknown)throughpointertoincorrectfunctiontype'foo::CBar&(*