问题标签 [libc++]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2353 浏览

ubuntu - 如何在 CMake 中设置 STL 实现?

我有兴趣尝试 clang,因为它具有静态分析功能。我目前正在使用 c++ 开发一个项目,在 ubuntu 11.04 上运行。clang 的一个问题是它不能与 libstdc++ 4.4 一起使用,除非我对其进行修补。我不想因为可能暂时涉足铿锵声而与 libstdc++ 源代码混为一谈。

另一种方法是使用 libc++ 而不是 libstdc++。不幸的是,我无法在网上找到有关使用 CMake 的替代 STL 实现的帮助。

我在我的 CMakeLists.txt 文件中写什么来告诉 CMake 使用 libc++?

0 投票
2 回答
2350 浏览

c++ - libc++ - bind() 的命名冲突?

经过令人惊讶的少量黑客攻击后,我设法在我的 Linux 机器上安装了 libc++(因为 libstdc++ 缺少一些东西)。不幸的是,由于具有相同名称的函数,我现有的一些代码现在已经损坏。

通常,按照我需要的方式,bind() 与套接字有关。然而,libc++ 自带了自己的 bind() 函数,基本上就是this但没有方便的命名空间来分隔它们。根据墨菲定律,编译器尝试使用错误的函数,并吐出错误。NetBeans 没有发现任何问题,因为它实际上是在 sys/socket.h 文件中查找,这是非常好的。

所以,这两个函数基本上都超出了我的控制范围,我如何告诉编译器(clang++)它应该在特定的头文件中查找,而不是在其他地方查找该函数?

0 投票
1 回答
6411 浏览

c++ - libc++ - 停止将 std 重命名为 std::__1?

经过大量的努力让 clang 和 libc++ 编译、运行、与 NetBeans 集成,甚至交叉编译到 32 位机器,我想我已经搞定了!所以我去使用一些 libstdc++ 没有的特性(完全颠覆我的开发环境的原因),然后发现......我实际上不能这样做。

libc++ 已安装,它可以工作,并且编译的程序(当它工作时)确实需要它。但是,编译器仍然会尝试使用 libstdc++ 版本,因为会弄乱命名空间;std::__1::map, std::__1::basic_string, 等等。现在,我从这个问题中知道为什么会发生这种情况,以及为什么 libc++ 会这样做。我只需要知道如何消除它,因为它完全不适用——我真的非常想使用 libc++ 版本,而且我的代码中没有任何内容需要这两种类型共存。

我尝试将 libstdc++ 文件夹从包含路径中取出,但失败了,这使它们完全无法访问。没运气。我没有使用任何附加库,只使用了内置的 Linux/POSIX 头文件(errno、socket、syslog、fcntl)。

编辑:错误信息:

libstdc++ 映射没有 emplace()。libc++ 版本可以

从命令行进行的以下调用似乎有效:

从 NetBeans 内部调用不会:

0 投票
4 回答
1267 浏览

c++ - libc++ 和 libstdc++ 之间的 istream eof 差异

以下(玩具)程序在与 libstdc++ 和 libc++ 链接时返回不同的内容。这是 libc++ 中的错误还是我不明白 istream eof() 的工作原理?我尝试在 linux 和 mac os x 上使用 g++ 并在 mac os x 上使用 clang 运行它,有和没有 -std=c++0x。我的印象是 eof() 在尝试读取(通过 get() 或其他方式)实际上失败之前不会返回 true。这是 libstdc++ 的行为方式,但不是 libc++ 的行为方式。

0 投票
4 回答
39757 浏览

c++ - make_shared 真的比 new 更高效吗?

我正在使用C++11 进行试验,并编写了一个小玩具示例,以查看shared_ptr调用. 作为基础架构,我使用 llvm/clang 3.0 以及 XCode4 中的 llvm std c++ 库。make_sharedmake_shared

现在看看输出,请:

使用 make_shared 创建 smart_ptr...

构造函数 make_shared

复制构造函数...

复制构造函数...

析构函数

析构函数

使用 make_shared 创建 smart_ptr:完成。

使用新创建 smart_ptr...

构造函数新

使用 new: done 创建 smart_ptr。

析构函数

析构函数

似乎make_shared调用了复制构造函数两次。如果我为Object使用常规分配内存,则new不会发生这种情况,只会Object构造一个。

我想知道的是以下内容。我听说这make_shared应该比使用new( 1 , 2 )更有效。一个原因是因为make_shared将引用计数与要管理的对象一起分配在同一块内存中。好的,我明白了。这当然比两个单独的分配操作更有效。

相反,我不明白为什么这必须伴随着两次调用Object. 因此,我不相信在每种make_shared情况下都比使用分配更有效。我在这里错了吗?好吧,可以实现一个移动构造函数,但我仍然不确定这是否比仅通过分配更有效。至少不是在所有情况下。如果复制比为引用计数器分配内存更便宜,那将是正确的。但是-internal 引用计数器可以使用几个原始数据类型来实现,对吧?newObjectObjectnewObjectshared_ptr

尽管概述了复制开销,您能否帮助并解释为什么make_shared在效率方面要走的路?

0 投票
1 回答
2013 浏览

clang - 在 Ubuntu 上使用 Clang 3.0 编译 libc++ 时出错

当我尝试libcxx在我的 Ubuntu 12.04 上使用 LLVM 3.0 和 Clang 3.0 编译 libc++ ( ) 时,我得到了错误

我应该把 cxxabi.h 放在哪里?目前在以下几个地方

0 投票
2 回答
632 浏览

c++ - xlocale 在 OS X 上坏了?

我有一个简单的程序,它使用在命令行上传递给它的一系列语言环境来测试 wchar_t 和 char 之间的转换。它通过打印出语言环境名称和转换失败的字符串来输出失败的转换列表。

我正在使用 clang 和 libc++ 构建它。我的理解是 libc++ 的命名语言环境支持由 OS X 上的 xlocale 库提供。

我看到了一些意想不到的失败,以及一些转换应该失败但没有失败的实例。

这是程序。

以下是一些正确输出的示例

这是一个不期望的输出示例

欧元字符确实存在于 ISO 8859-15 字符集中,因此这不应该失败。

以下是我期望但未收到的输出示例

这是 ISO 8859-1 中存在的货币符号,但在 ISO 8859-15 中已被删除并替换为欧元符号。此转换不应成功,但不会发出错误信号。当进一步检查这个案例时,我发现在这两种情况下,“¤”都被转换为 0xA4,这是“¤”的 ISO 8859-1 表示。

我没有直接使用 xlocale,只是通过 libc++ 间接使用。Mac OS X 上的 xlocale 是否被错误的语言环境定义破坏了?有没有办法解决它?还是我看到的问题是其他原因造成的?

0 投票
2 回答
13382 浏览

c++ - 为什么 system() 失败并显示错误代码 127?

在 Linux 系统上,我试图通过调用在运行时调用程序system()。系统调用以不等于零的返回码退出。

调用WEXITSTATUS错误代码给出“127”。

根据系统的手册页,此代码表明/bin/sh无法调用:

如果/bin/sh无法执行,退出状态将是执行的命令的状态exit(127)

我检查了:/bin/sh是一个链接bashbash在那儿。我可以从外壳执行它。

现在,我怎样才能找出为什么/bin/sh不能被调用?任何内核历史或什么?

编辑:

在非常有用的提示(见下文)之后,我strace -f -p <PID>的过程。这是我在system通话期间得到的:

当谈到调用/bin/sh它说坏地址。为什么 ?

编辑:

这里涉及失败的整个部分system(这里已经安全复制到缓冲区):

输出:

编辑(代码的第一个版本):

字符串创建的复杂性不是这里的问题。如图strace所示,“错误地址”是问题所在。它是一个合法的字符串。不应出现“错误地址”。

据我所知,std::string::c_str()返回的 aconst char *可能指向 libc++ 的暂存空间,其中可能保留字符串的只读副本。

不幸的是,该错误并不是真正可重现的。在失败之前调用system成功多次。

我不想仓促,但它闻起来像是内核、libc 或硬件中的错误。

编辑:

我为失败的系统调用生成了更详细的strace输出 ( ):strace -f -v -s 2048 -e trace=process -p $!execve

首先是一个成功的调用:

现在失败的一个:

这里<list of vars>是相同的。似乎它不是导致错误地址的环境变量列表。正如 Chris Dodd 提到的 execve 的第三个参数是原始指针 0x14595af0,strace 认为(并且内核同意)是无效的。strace不将其识别为字符串(因此它打印十六进制值而不是字符串)。

编辑:

我从指针值中插入打印出来,cmd看看父进程中这个指针的值是什么:

输出(对于失败的调用):

它的指针值与来自 的第三个参数相同strace。(我更新了strace上面的输出)。

关于指针的 32 位外观cmd:我检查了cmd指针的值以进行后续调用。看不出结构上有什么区别。cmd这是thensystem调用成功时的值之一:

所以,在system调用之前指针是有效的。正如strace上面的输出表明子进程(在调用之后fork)接收到正确的指针值。但是,由于某种原因,指针值在子进程中被标记为无效。

现在我们认为它要么:

  • libc/内核错误
  • 硬件问题

编辑:

同时让我发布一个解决方法。被迫实施这样的事情真是太愚蠢了……但它确实有效。system因此,如果调用失败,将执行以下代码块。它分配新的命令字符串并重试直到成功(不是无限期地)。

编辑:

我刚刚看到这种解决方法在一次特定的运行中不起作用。它一路走来,1000 次尝试,全部使用新分配的cmd命令字符串。1000 次全部失败。不仅如此。我尝试了不同的 Linux 主机(相同的 Linux/软件配置)。

考虑到这一点,可能会排除硬件问题。(然后必须在 2 个物理上不同的主机上)。仍然是内核错误??

编辑:

torek,我将尝试安装修改后的system呼叫。给我一些时间。

0 投票
2 回答
2584 浏览

imagemagick - 使用自动工具将“-stdlib=libc++”传递给 c++ 链接器

我正在尝试使用 clang++ 和 libc++ 编译 ImageMagick(尤其是 Magick++)。因此我需要将 -stdlib=libc++ 传递给编译器和链接器。

虽然 CXXFLAGS="-stdlib=libc++" 可以正常编译,但 LDFLAGS="-stdlib=libc++" 似乎只影响 C 链接器。

链接 C++ 库时如何正确告诉 ./configure 或 make 使用此标志?

0 投票
1 回答
3049 浏览

ios - iOS dyld:库未加载:/usr/lib/libc++.1.dylib

我正在创建的 iOS 应用程序使用 ZXing、Couchbase 和 Couchcocoa。最初我只需要 libc++.dylib 就可以使用模拟器运行程序。

当我尝试在设备上运行时,它构建成功但随后崩溃并且我得到了日志:

然后我在链接二进制库中添加了 libc++.1.dylib。而且我仍然得到相同的日志。