Tag: clang

“安装python库时'cc'失败,退出状态1”错误

像其他许多人一样,我遇到安装python库的问题(作为tar下载,然后解压缩)。 rodolphe-mbp:python-Levenshtein-0.11.2 Rodolphe$ sudo python setup.py install running install running bdist_egg running egg_info writing requirements to python_Levenshtein.egg-info/requires.txt writing python_Levenshtein.egg-info/PKG-INFO writing namespace_packages to python_Levenshtein.egg-info/namespace_packages.txt writing top-level names to python_Levenshtein.egg-info/top_level.txt writing dependency_links to python_Levenshtein.egg-info/dependency_links.txt writing entry points to python_Levenshtein.egg-info/entry_points.txt reading manifest file 'python_Levenshtein.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' warning: no files found matching '*' under directory 'docs' warning: […]

为什么gcc和clang都会为这个程序产生不同的输出? (转换运算符vs构造函数)

程序: #include <stdio.h> struct bar_t { int value; template<typename T> bar_t (const T& t) : value { t } {} // edit: You can uncomment these if your compiler supports // guaranteed copy elision (c++17). Either way, it // doesn't affect the output. // bar_t () = delete; // bar_t (bar_t&&) = delete; // bar_t […]

g ++和clang ++与积分模板参数的不同行为

我有以下C ++ 11代码。 #include <type_traits> using IntType = unsigned long long; template <IntType N> struct Int {}; template <class T> struct is_int : std::false_type {}; template <long long N> struct is_int<Int<N>> : std::true_type {}; int main() { static_assert (is_int<Int<0>>::value, ""); return 0; } Clang ++ 3.3编译代码,但在g ++ 4.8.2静态断言失败 $ g++ -std=c++11 main.cpp main.cpp: In function […]

为什么这个未使用的variables没有被优化?

我和Godbolt的CompilerExplorer玩过。 我想看看某些优化有多好。 我最低工作的例子是: #include <vector> int foo() { std::vector<int> v {1, 2, 3, 4, 5}; return v[4]; } 生成的汇编程序(由clang 5.0.0,-O2 -std = c ++ 14): foo(): # @foo() push rax mov edi, 20 call operator new(unsigned long) mov rdi, rax call operator delete(void*) mov eax, 5 pop rcx ret 正如人们所看到的,铿锵知道答案,但在返回之前做了很多事情。 在我看来,即使vector是创build,因为“运营商新/删除”。 任何人都可以向我解释这里发生了什么,为什么它不只是返回? 由GCC生成的代码(不在这里复制)似乎明确地构造了向量。 有谁知道GCC不能推断出结果?

有可能使用lldbdebugging一个gcc编译的程序,或使用gdbdebugging一个铿锵编译的程序?

(前言:我对C / C ++来说很新,而且我不太清楚在本地代码中的debugging是如何工作的。) 有些消息来源说,gdb和lldb可以debugging任何编译成机器码的程序 。 其他人说,要用gdb进行debugging,你必须在gcc 中用-g标志进行编译。 gcc的文档本身表明这是可选的,实际上,如果使用它,它可能会导致gdb 以外的其他debugging器出现问题。 铿锵也有一个-g标志,文档基本上只是说“生成debugging信息”。 那么这些debugging器限制在自己的工具链(GNU和LLVM)中,还是在某种程度上独立于所使用的编译器?

GCC接受`constexpr struct {};`但Clang拒绝它。 谁是正确的?

下面的代码用GCC编译得很好: constexpr struct {} s; 但铿锵拒绝它与以下错误: 错误:默认初始化一个consttypes为“const struct(anonymous struct at …)”的对象,没有用户提供的默认构造函数 我已经testing了所有版本的GCC和Clang,我可以在https://gcc.godbolt.org/find。 GCC的每个版本都接受代码,Clang的每个版本都拒绝它。 我想知道哪种编译器在这种情况下是正确的? 标准对此有何评论?

在linux下libcxxabi有意义吗? 有什么好处?

我试图确定是否build立和使用linux下的llvm项目的libcxxabi是有道理的。 我的libcxxabi链接到 ldd libc++abi.so.1.0 linux-vdso.so.1 => (0x00007fff2e0db000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd658f0d000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fd658d05000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd65893c000) libc++.so.1 => /path/where/clang/is // edited /lib64/ld-linux-x86-64.so.2 (0x00007fd6593ab000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd658465000) 所以它使用gcc_s库,GNU librt,唯一真正的区别是它使用libc++不是libstdc++ ,但是这真的有多好? 鉴于abi图书馆的关键作用,我应该在这样的平台下去找libcxxabi ? 我的问题不是如何build立这个,或者如果这能够工作,但如果这是一个好主意C ++明智 ,我可能得到什么样的好处,或者如果你已经使用这个好处,你会得到什么样的好处。

让Clang在Windows上工作

我遵循了下面的一步一步的指导 ,我已经pipe理了一些小窍门,让clang编译使用code:blocks和MinGW。 太棒了,所以现在我可以添加Clang模块到eclipse(为什么有一个IDE,当你可以有四个),并开始编译。 我可以编译一个不使用标准库的简单程序,但不幸的是,当我尝试编译这个程序时: #include <iostream> using namespace std; int main() { cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! return 0; } 首先我得到这个: .. \ src \ test.cpp:9:10:致命错误:找不到'iostream'文件 所以我将Mingw标题添加到包含path中; 那么我得到这个: '致命的错误:'位/ c + + config.h'文件未find' 这很奇怪。 为什么明文工作,如果该文件不是“位/”? 它是内置于编译器? 没关系,我find了一个实现它,并创build'bits /'的文件。 然后,我得到了一个包括奇怪的错误,似乎表明要么铛没有正确实施预处理器,否则我对预处理器的理解不正确的错误风暴。 C:\Program Files\CodeBlocks\MinGW\lib\gcc\mingw32\4.4.1\include\c++/cwchar:45:26: error: expected value in expression #if _GLIBCXX_HAVE_WCHAR_H 还有更多这样的。 应该是的 […]

列表初始化期间临时对象的生存期

我一直认为,临时性的东西一直存在,直到一个完整的expression式结束。 然而这是一个std::vector和一个数组的初始化之间的一个奇怪的区别。 请考虑下面的代码: #include <iostream> #include <vector> struct ID{ static int cnt; // the number of living object of class ID at the moment of creation: int id; ID():id(++cnt){} ~ID(){ cnt–; } }; int ID::cnt=0; int main(){ int arr[]{ID().id, ID().id}; std::vector<int> vec{ID().id, ID().id}; std::cout<<" Array: "<<arr[0]<<", "<<arr[1]<<"\n"; std::cout<<" Vector: "<<vec[0]<<", "<<vec[1]<<"\n"; } 这个程序的输出是有点意外的(至less对我来说): Array: 1, […]

从unique_ptr创build一个shared_ptr

在我最近回顾的一段代码中,用g++-4.6编译得很好,我遇到了一个奇怪的尝试,从std::unique_ptr创build一个std::shared_ptr : std::unique_ptr<Foo> foo… std::make_shared<Foo>(std::move(foo)); 这对我来说似乎很奇怪。 这应该是std::shared_ptr<Foo>(std::move(foo)); afaik,虽然我不完全熟悉的动作(我知道std::move只是一个演员,没有得到移动)。 使用此SSC上的不同编译器进行检查(NUC *)E #include <memory> int main() { std::unique_ptr<int> foo(new int); std::make_shared<int>(std::move(foo)); } 汇编结果: g ++ – 4.4.7给出编译错误 g ++ – 4.6.4编译没有任何错误 g ++ – 4.7.3给出了内部编译器错误 g ++ – 4.8.1给出了编译错误 铿锵声++ – 3.2.1编译没有任何错误 所以问题是:哪个编译器在标准方面是正确的? 标准是否要求这是一个无效的陈述,一个有效的陈述,或者这只是未定义的? 加成 我们已经同意,其中一些编译器(如clang ++和g ++ – 4.6.4)允许转换,而不应该转换。 然而,使用g ++ – 4.7.3(它在std::make_shared<Foo>(std::move(foo)); )上产生内部编译器错误,正确地拒绝了int bar(std::move(foo)); 由于这种巨大的行为差异,我将这个问题保持原样,尽pipe其中的一部分可以通过减lessint […]