标签: libc++

clang的libc ++生产准备好了吗?

有没有人libc++在制作中使用clang有积极的经验?http://libcxx.llvm.org/libcxx_by_chapter.pdf上的状态图对我来说看起来不太好.

c++ clang libc++

5
推荐指数
1
解决办法
526
查看次数

Clang:麻烦使用bind或mem_fn与string :: c_str和transform

试图将std :: string的向量转换为const char*的向量:

#include <algorithm>
#include <functional>
#include <string>
#include <vector>

int main(int argc, char** argv)
{
    std::vector<std::string> values;
    values.push_back("test1");
    values.push_back("test2");
    values.push_back("test3");

    std::vector<const char*> c_values(values.size());

    std::transform(values.begin(), values.end(), c_values.begin(), std::mem_fn(&std::string::c_str));
    std::transform(values.begin(), values.end(), c_values.begin(), std::bind(&std::string::c_str, std::placeholders::_1));
    std::transform(values.begin(), values.end(), c_values.begin(), [](const std::string& str) { return str.c_str(); });

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用g ++(4.7.2)进行编译时,所有三个选项都可以编译和链接.使用clang进行编译时,选项1和2无法链接,生成:

$ clang -std=c++11 -stdlib=libc++ -lc++ stringtransform.cpp 
Undefined symbols for architecture x86_64:
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::c_str() const", referenced from:
    _main in stringtransform-ff30c1.o
ld: symbol(s) not found for architecture x86_64
Run Code Online (Sandbox Code Playgroud)

我发现我需要使用lambda版本(选项3),如果我希望它使用g ++和clang在平台之间正确链接.我是否遇到了链接器错误或者clang的C++ …

c++ lambda stdbind c++11 libc++

5
推荐指数
1
解决办法
556
查看次数

链接OSX Homebrew Gfortran与libc ++

我有一个带有大型C++组件的项目,我能够使用OSX上的clang成功编译(Apple LLVM版本6.1.0(clang-602.0.49)(基于LLVM 3.6.0svn).由于OSX不提供Fortran编译器我通过Homebrew安装了gfortran.

编译工作正常,但我无法将编译的Fortran代码与之前编译的C++代码链接:我收到以下错误:

$ make fortran
Undefined symbols for architecture x86_64:
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::compare(char const*) const", referenced from:
      DataFieldInfo::FromJSON(JSONNode const&) in [...]
  "std::__1::__vector_base_common<true>::__throw_length_error() const", referenced from:
      std::__1::vector<char, std::__1::allocator<char> >::allocate(unsigned long) in [...]
      void std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::__push_back_slow_path<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in [...]
      void std::__1::vector<JSONNode, std::__1::allocator<JSONNode> >::__push_back_slow_path<JSONNode const>(JSONNode const&) in [...]
[...]
Run Code Online (Sandbox Code Playgroud)

这告诉我,我在Fortran和C++部分之间存在链接问题.

如何将Fortran部分与libc ++链接?Homebrew提供的gfortran可以实现吗?解决这个问题的最佳方法是什么?我应该尝试使用clang ++进行链接吗?

macos fortran libc++

5
推荐指数
1
解决办法
590
查看次数

为什么 std::ios_base::sync_with_stdio 没有在 libc++ (clang) 中实现?

让我们看一下这个代码示例:

#include <iostream>

int main() {
    std::ios_base::sync_with_stdio(false);

    int n;
    std::cin >> n;
    for (int i = 0; i < n; ++i) {
        int buf;
        std::cin >> buf;
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码示例在输入上的性能如下:

10000000
0
1
...
9999999
Run Code Online (Sandbox Code Playgroud)

在我的机器上:

g++-5 -O2 -std=c++11:

./a.out < input.txt  0.86s user 0.07s system 98% cpu 0.942 total
Run Code Online (Sandbox Code Playgroud)

clang-700.0.72 -O2 -std=c++11

./a.out < input.txt  38.69s user 0.21s system 99% cpu 39.248 total
Run Code Online (Sandbox Code Playgroud)

经过一些分析后,我发现 libc++ 根本不会禁用同步。

然后我查看他们的代码,发现了这个: https: //github.com/llvm-mirror/libcxx/blob/6a85e8a355be05b9efa8408f875014e6b47cef3b/src/ios.cpp#L458

所以我的问题是,这是设计使然还是错误?

c++ performance clang c++11 libc++

5
推荐指数
1
解决办法
604
查看次数

SFINAE与std :: enable_if和std :: is_default_constructible用于libc ++中的不完整类型

我刚刚观察到libc ++的一个奇怪问题,当使用SFINAE来检测模板类型是否是默认构造时.

以下是我能够提出的最小例子:

#include <iostream>
#include <type_traits>

template <typename T>
struct Dummy;

template <>
struct Dummy<int>{};

template <typename T, typename = void>
struct has_dummy : std::false_type {};

template <typename T>
struct has_dummy<C, std::enable_if_t<std::is_default_constructible<Dummy<T>>::value>> : std::true_type{};

int main() {
    std::cout << std::boolalpha << has_dummy<int>{}() << '\n';
    std::cout << std::boolalpha << has_dummy<double>{}() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

它编译并输出预期的行,truefalse在使用时使用g ++或clang ++编译libstdc++.但是,当我尝试使用libc ++(即clang++ -stdlib=libc++ -std=c++1z test.cpp)编译它时,我收到以下错误:

/usr/bin/../include/c++/v1/type_traits:2857:38:错误:隐式实例化未定义模板'Dummy':public integral_constant

/usr/bin/../include/c++/v1/type_traits:3166:14:注意:在这里请求模板类'std :: __ 1 :: is_constructible>'的实例化:public is_constructible <_Tp>

test.cpp:14:43:注意:在这里请求模板类'std :: …

c++ templates sfinae language-lawyer libc++

5
推荐指数
1
解决办法
686
查看次数

自引用unordered_map会导致gcc 5.3出现问题,但不会导致clang问题

以下代码无法在gcc 5.3编译(它是从更大的代码片段中获取的简化版本):

#include <unordered_map>
#include <string>

class Foo {
    std::unordered_map<std::string, Foo> m;  //"self-referential"
};

int main()
{
    Foo f;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

出现以下错误:

g++ --std=c++1y  -c rh.cpp

In file included from /usr/local/include/c++/5.3.0/utility:70:0,
                 from /usr/local/include/c++/5.3.0/unordered_map:38,
                 from rh.cpp:1:
/usr/local/include/c++/5.3.0/bits/stl_pair.h: In instantiation of ‘struct std::pair<const int, Foo>’:
/usr/local/include/c++/5.3.0/ext/aligned_buffer.h:85:34:   required from ‘struct __gnu_cxx::__aligned_buffer<std::pair<const int, Foo> >’
/usr/local/include/c++/5.3.0/bits/hashtable_policy.h:246:43:   required from ‘struct std::__detail::_Hash_node_value_base<std::pair<const int, Foo> >’
/usr/local/include/c++/5.3.0/bits/hashtable_policy.h:292:12:   required from ‘struct std::__detail::_Hash_node<std::pair<const int, Foo>, false>’
/usr/local/include/c++/5.3.0/bits/hashtable_policy.h:1896:60:   required from ‘struct std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<const int, Foo>, false> …
Run Code Online (Sandbox Code Playgroud)

c++ gcc libstdc++ clang++ libc++

5
推荐指数
1
解决办法
277
查看次数

CMAKE:在 clang/g++ 和 libc++/libstdc++ 之间切换

这是我的第一个 cmake 文件。我有一个带有 clang 和 g++ 的 linux 系统。还安装了 libc++。我在 Mac (xcode) 上开发但部署到 linux。我正在编写一个 cmake 文件,我可以在其中选择 clang 或 g++ 和 libc++ 或 libstdc++。所以有 4 种可能的组合。

我想出了如何选择编译器并在其上强制使用 c++11,但我无法弄清楚如何指定标准库。有什么建议?

这是我到目前为止:

## cmake ###
cmake_minimum_required (VERSION 3.5)

#set project directories
set(ProjectDirectory ${CMAKE_SOURCE_DIR}) #.../Project/
set(BuildDirectory ${ProjectDirectory}/Build)
set(ProductDirectory ${ProjectDirectory}/Products)
set(sourceDirectory ${ProjectDirectory}/Source)

#print project directories
message(${ProjectDirectory})
message(${BuildDirectory})
message(${ProductDirectory})

#configure cmake
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ProductDirectory})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${ProductDirectory})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${ProductDirectory})

set(CMAKE_VERBOSE_MAKEFILE on)

#compiler and standard library settings
set(CMAKE_CXX_COMPILER "clang++")
set(CMAKE_CXX_STANDARD 11)
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v -stdlib=libc++")
        #libstdc++ #linux
        #libc++    #OS X …
Run Code Online (Sandbox Code Playgroud)

g++ cmake libstdc++ clang++ libc++

5
推荐指数
1
解决办法
9063
查看次数

为什么从管道读取时libc ++ getline会阻塞,而libstdc ++ getline却不会呢?

TL; DR

使用该函数libc++版本的程序getline在从管道读取输入时将阻塞,直到管道缓冲区已满。

对于该函数的版本,情况并非如此:在此处,该函数将立即读取并在输入可用后立即返回一行输入。libstdc++getline

我应该期待libstdc++和之间的这种行为差异libc++吗?[ 编辑:我在这里不是要征求意见,我只是对管道不甚了解,也对实施C ++标准库的困难不甚了解。对我来说,这种行为差异肯定令人惊讶的,但也许有人知道更好,可以向我保证这种差异是可以预料的,也许这只是一个实现细节?]

更重要的是,我该怎么做才能libc++像人一样libstdc++?也就是说,该getline函数不应等到管道缓冲区已满,而应在可用时立即返回一行输入。

参见下面的代码示例,该代码示例显示了如何读取和写入管道。

环境

  • macOS 10.13.1(High Sierra)
  • Xcode 9.1
  • Apple LLVM版本9.0.0(clang-900.0.38)

我怀疑问题不仅限于macOS,但我还没有clang可以用来测试的Linux开发系统。

测试准备

打开三个壳,我们称它们为A,B和C。

在外壳A中:创建一个新文件pipe-test.cpp并从下面添加源代码。一次编译源代码,一次编译libstdc++一次libc++

g++ -stdlib=libstdc++ -o pipe-test-libstdc++ pipe-test.cpp
g++ -stdlib=libc++ -o pipe-test-libc++ pipe-test.cpp
Run Code Online (Sandbox Code Playgroud)

在外壳A中:创建两个管道:

mkfifo input-pipe output-pipe
Run Code Online (Sandbox Code Playgroud)

测试1,使用libstdc++程序版本

  • 在外壳A中,运行以下命令: pipe-test-libstdc++ input-pipe output-pipe
  • 在外壳B中,运行以下命令: cat output-pipe
  • 在shell C中,运行以下命令: cat >input-pipe
  • 在外壳C中,键入“ foo”行,然后按Enter。 …

c++ getline libstdc++ libc++

5
推荐指数
1
解决办法
413
查看次数

__vector_base_common 是怎么回事?

我想看看 C++ 向量是如何制作的。我发现了这个,实现是 LLVM 编译器https://llvm.org/svn/llvm-project/libcxx/trunk/src/vector.cpp appleclang

src/vector.cpp:

#include "vector"

_LIBCPP_BEGIN_NAMESPACE_STD

template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __vector_base_common<true>;

_LIBCPP_END_NAMESPACE_STD
Run Code Online (Sandbox Code Playgroud)

实现https://llvm.org/svn/llvm-project/libcxx/trunk/include/vector appleclang LLVM。

包括/向量:

// .. deleted code

template <bool>
class __vector_base_common
{
protected:
    _LIBCPP_ALWAYS_INLINE __vector_base_common() {}
    _LIBCPP_NORETURN void __throw_length_error() const;
    _LIBCPP_NORETURN void __throw_out_of_range() const;
};

template <bool __b>
void
__vector_base_common<__b>::__throw_length_error() const
{
    _VSTD::__throw_length_error("vector");
}

template <bool __b>
void
__vector_base_common<__b>::__throw_out_of_range() const
{
    _VSTD::__throw_out_of_range("vector");
}

_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __vector_base_common<true>)

// .. deleted code

template <class _Tp, class _Allocator>
class __vector_base
    : protected __vector_base_common<true>

// .. …
Run Code Online (Sandbox Code Playgroud)

c++ libc++

5
推荐指数
1
解决办法
918
查看次数

在 Mac OS 10.14 上安装 thrift_sasl

当我通过 pip 安装 thrift_sasl 时。

须藤 pip 安装 thrift_sasl

我遇到了一个错误。错误信息如下:

Running setup.py install for sasl ... error
Complete output from command /Library/Frameworks/Python.framework/Versions/3.6/bin/python3 -u -c "import setuptools, tokenize;__file__='/private/tmp/pip-install-6cb6xrs8/sasl/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /private/tmp/pip-record-aqa804ck/install-record.txt --single-version-externally-managed --compile:
running install
running build
running build_py
creating build
creating build/lib.macosx-10.6-intel-3.6
creating build/lib.macosx-10.6-intel-3.6/sasl
copying sasl/__init__.py -> build/lib.macosx-10.6-intel-3.6/sasl
running egg_info
writing sasl.egg-info/PKG-INFO
writing dependency_links to sasl.egg-info/dependency_links.txt
writing requirements to sasl.egg-info/requires.txt
writing top-level names to sasl.egg-info/top_level.txt
warning: manifest_maker: standard file '-c' not found

reading manifest file …
Run Code Online (Sandbox Code Playgroud)

python macos sasl libc++

5
推荐指数
1
解决办法
1026
查看次数