2014-09-15 16 views
13

Tôi muốn sử dụng C++ 11 hoặc C++ 14 với clang/clang ++ trên CentOS 7. Làm thế nào để xây dựng môi trường xây dựng này?Làm thế nào để xây dựng libcxx và libcxxabi bằng clang trên CentOS 7

+0

Nếu bạn không muốn xây dựng bất cứ điều gì, bạn có thể sử dụng C++ 11 ([mà không cần '' ] (http://stackoverflow.com/q/12530406/1398841)) với Clang 3.4.2 và cài đặt sẵn libstdC++ trên CentOS 7. Bật [EPEL] (https://fedoraproject.org/wiki/EPEL) lưu trữ và 'yum install clang' để nhận [Clang 3.4.2] (https://centos.pkgs.org/7/epel-x86_64/clang-3.4.2-8.el7.x86_64.rpm.htm l). – phoenix

Trả lời

18

Bài viết này dạy cách xây dựng môi trường xây dựng C++ 11 trên CentOS 7: Repel EPEL của RHEL cung cấp gói Clang, nhưng không có gói thư viện C++. Vì vậy, những bộ phận này là một chút rắc rối để được xây dựng bằng tay. Các thư viện C++ tùy chỉnh cho Clang là libC++ (libcxx) [1]. Sau đó, libcxx cũng cần thư viện ABI, libC++ abi (libcxxabi) [2]. Thật không may, hai thư viện này có một vấn đề phụ thuộc vòng tròn. Để phá vỡ vấn đề phụ thuộc vòng tròn, libC++ có thể được xây dựng mà không cần liên kết libC++ abi. Sau đó, với libC++ này, chúng ta có thể xây dựng libC++ abi liên kết libC++. Cuối cùng, với libC++ abi, chúng ta có thể xây dựng một libC++ mới liên kết libC++ abi.

Các kêu vang, libC++, và libC++ bước xây dựng môi trường abi được đưa ra trong những điều sau đây:

  1. Thêm EPEL repo RHEL của. Mở liên kết sau và tìm phần "Làm cách nào tôi có thể sử dụng các gói bổ sung này?" https://fedoraproject.org/wiki/EPEL
    Tìm gói epel cho phiên bản CentOS của bạn. Ví dụ::

    sudo rpm -i https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 
    
  2. Cài đặt Subversion để nhận libcxx và libcxxabi mới nhất.

    sudo yum install svn 
    
  3. Cài đặt Clang và llvm-devel (với llvm-config).

    sudo yum install clang llvm-devel 
    
  4. Cài đặt cmake.

    cd /usr/local 
    wget https://cmake.org/files/v3.5/cmake-3.5.2-Linux-i386.sh 
    sudo chmod 755 cmake-3.5.2-Linux-i386.sh 
    sudo ./cmake-3.5.2-Linux-i386.sh 
    # Check cmake is in /usr/local/bin. 
    
  5. Vòng đầu tiên để xây dựng libcxx mà không cần libcxxabi.

    # Get libcxx. 
    svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx 
    cd libcxx 
    # It is not recommended to build libcxx in the source root directory. 
    # So, we make a tmp directory. 
    mkdir tmp 
    cd tmp 
    # Specifying CMAKE_BUILD_TYPE to Release shall generate performance optimized code. 
    # The CMAKE_INSTALL_PREFIX changes the install path from the default /usr/local to /usr. 
    cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ .. 
    sudo make install 
    cd .. 
    rm tmp -rf 
    cd .. 
    
  6. Xây dựng libcxxabi bằng libC++.

    # Get libcxxabi. 
    svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi 
    cd libcxxabi 
    mkdir tmp 
    cd tmp 
    cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLIBCXXABI_LIBCXX_INCLUDES=../../libcxx/include .. 
    sudo make install 
    cd ../.. 
    
  7. Vòng 2 để xây dựng libcxx với libcxxabi.

    cd libcxx 
    mkdir tmp 
    cd tmp 
    # This time, we want to compile libcxx with libcxxabi, so we have to specify LIBCXX_CXX_ABI=libcxxabi and the path to libcxxabi headers, LIBCXX_LIBCXXABI_INCLUDE_PATHS. 
    cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLIBCXX_CXX_ABI=libcxxabi -DLIBCXX_CXX_ABI_INCLUDE_PATHS=../../libcxxabi/include .. 
    sudo make install 
    
  8. Viết chương trình thử nghiệm C++.

    // t.cpp 
    #include <iostream> 
    using namespace std; 
    int main() { 
        cout << "Hello world!" << endl; 
    } 
    
  9. Kiểm tra bản dịch C++ bằng clang ++.

    # -std specifies the C++ standard. -stdlib specifies the C++ library you want to use with clang/clang++. -lc++abi is necessary, because the new LD (linker and loader) on CentOS 7 doesn't allow indirect library linking. 
    clang++ -std=c++11 -stdlib=libc++ -lc++abi t.cpp 
    ./a.out 
    

Tài liệu tham khảo:
[1] http://libcxx.llvm.org/
[2] http://libcxxabi.llvm.org/

+0

Điều này thực sự hữu ích, tôi muốn bạn có thể chia sẻ một giải thích chi tiết hơn về lý do tại sao các bước này là cần thiết. –

+0

Ngoài ra, FWIW, dường như không hoạt động trên Fedora 20. :( –

+1

Xin lỗi, tôi không phải là chuyên gia giải thích mọi thứ chính xác. Tuy nhiên, các bước này chỉ hoạt động trên CentOS 7. Tôi sẽ cố gắng thêm một số nhận xét có thể Tôi có thể: –

Các vấn đề liên quan