LLVM là một cơ sở hạ tầng trình biên dịch mã nguồn mở. LLVM được bắt đầu vào năm 2000 và được Apple sử dụng và sửa đổi rộng rãi từ năm 2005. Clang là trình biên dịch C, C ++, Objective-C và Objective-C ++ hoạt động với hệ thống LLVM. Clang được Apple bắt đầu vào năm 2007 và kể từ đó Google và Intel đã tham gia vào quá trình phát triển liên tục của mình.
Các nhà phát triển của Clang tuyên bố rằng so với GCC, nó biên dịch nhanh hơn, sử dụng ít bộ nhớ hơn, mang lại chẩn đoán thân thiện với người dùng hơn trong quá trình biên dịch và tương thích với GCC.
CentOS theo sự phát triển của Red Hat Enterprise Linux (RHEL). RHEL phấn đấu trở thành một nền tảng máy chủ ổn định, điều đó có nghĩa là nó không vội vàng bao gồm các phiên bản mới nhất của mọi thứ.
Khi viết bài viết này, CentOS 6 chính thức phân phối LLVM & Clang v3.4.2. Tuy nhiên, Clang v3.6 đã được phát hành.
Gợi ý chính thức là nếu bạn cần một phiên bản LLVM & Clang mới hơn, bạn nên xem xét một bản phân phối UNIX khác tập trung hơn vào việc hỗ trợ các phiên bản mới nhất của các gói phần mềm.
May mắn thay, bạn có thể cài đặt phiên bản LLVM & Clang GCC mới hơn trên CentOS. Điều này đi chệch khỏi hoàn toàn sử dụng phần mềm phân phối chính thức, nhưng đôi khi bạn có thể cảm thấy như bạn có ít sự lựa chọn.
Bài viết này mô tả cách cài đặt phiên bản LLVM & Clang được hỗ trợ chính thức của CentOS 6 và cách cài đặt phiên bản mới hơn. Bài viết này giả định rằng bạn có VPS CentOS 6 mới cài đặt, tuy nhiên bạn chắc chắn có thể làm theo hướng dẫn trên VPS bạn đã sử dụng.
Clang phần lớn là độc lập với GCC, nhưng như các văn bản của bài viết này, Clang vẫn sử dụng một số thư viện chia sẻ được cài đặt bởi GCC (cụ thể là, crtbegin.o
, gcc
, và gcc_s
). Nếu bạn cài đặt LLVM & Clang trên CentOS 6, bạn sẽ không thể biên dịch bất cứ thứ gì nếu bạn không có GCC trên hệ thống của mình cho các thư viện dùng chung này. Lý tưởng nhất là yum sẽ có một gói phụ thuộc cho tiếng kêu của gcc và gcc-c ++, nhưng khi viết bài viết này, yum không biết về sự phụ thuộc.
Ngoài ra, việc xây dựng phiên bản LLVM & Clang mới hơn từ nguồn yêu cầu G ++ v4.7 +, mà bạn chỉ có thể có trên CentOS 6 bằng cách cài đặt nó theo nguồn.
Nếu bạn chạy tất cả các bước bên dưới, bạn sẽ kết thúc với 2 phiên bản GCC và 2 phiên bản LLVM & Clang. Điều này bao gồm một phiên bản cũ nhị phân được hỗ trợ chính thức và một phiên bản mới hơn từ nguồn cho mỗi chương trình. Tuy nhiên, không cần phải chạy tất cả các bước dưới đây. Bạn có thể quyết định xem bạn muốn phiên bản LLVM & Clang nhị phân cũ được hỗ trợ chính thức hay phiên bản mới hơn từ nguồn và chạy bất kỳ phần hướng dẫn nào phù hợp với quyết định của bạn.
Cài đặt phiên bản LLVM & Clang được hỗ trợ chính thức (cũ hơn)
-
QUAN TRỌNG! Trước tiên, hãy cài đặt phiên bản GCC được hỗ trợ chính thức (cũ hơn), bằng cách thực hiện các bước trong bài viết Cách cài đặt GCC trên CentOS 6 - bạn KHÔNG cần thực hiện các bước trong tiêu đề của bài viết đó "Cài đặt phiên bản GCC mới hơn từ nguồn ".
-
Cài đặt LLVM & Clang
sudo yum install clang
--- This will bring in llvm as a dependency
-
Kiểm tra các phiên bản đã cài đặt và xem vị trí của chúng.
clang --version
May say: clang version 3.4.2 (tags/RELEASE_34/dot2-final)
which clang
/usr/bin/clang
gcc --version
May say: gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
g++ --version
May say: g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
which gcc
/usr/bin/gcc
which g++
/usr/bin/g++
Cài đặt phiên bản mới hơn của LLVM & Clang từ nguồn
Để xây dựng LLVM & Clang theo nguồn trên CentOS, bạn phải có GCC v4.7 trở lên. CentOS 6 không có phiên bản cao này trong yum, vì vậy trước tiên bạn phải cài đặt GCC mới hơn từ nguồn.
-
QUAN TRỌNG! Trước tiên, hãy cài đặt phiên bản GCC mới hơn từ nguồn, bằng cách thực hiện các bước trong bài viết Cách cài đặt GCC trên CentOS 6 - bạn cần thực hiện tất cả các bước trong bài viết đó, bao gồm trong tiêu đề "Cài đặt phiên bản GCC mới hơn từ nguồn ".
-
Cài đặt thêm các gói yêu cầu.
sudo yum install cmake
-
Cài đặt phiên bản mới hơn của Python. LLVM & Clang v3.6.0 yêu cầu Python v2.7 +, nhưng kho lưu trữ CentOS 6 yum chỉ có Python v2.6.6.
mkdir ~/sourceInstallations
cd ~/sourceInstallations
wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
tar -xvf Python-2.7.9.tgz
cd Python-2.7.9
./configure && make && sudo make install
-
Quyết định phiên bản LLVM & Clang nào bạn muốn. Lệnh này sẽ hiển thị cho bạn "thẻ" cho các phiên bản có sẵn.
svn ls http://llvm.org/svn/llvm-project/llvm/tags | grep RELEASE
RELEASE_1/
...
RELEASE_352/
RELEASE_360/
RELEASE_361/
svn ls http://llvm.org/svn/llvm-project/llvm/tags/RELEASE_361
rc1/
--- At this time, there is no final, just a release candidate. You could certainly use a release candidate, but this article will show how to use a final release.
svn ls http://llvm.org/svn/llvm-project/llvm/tags/RELEASE_360
final/
rc1/
rc2/
rc3/
rc4/
-
Lấy nguồn của phiên bản LLVM & Clang mà bạn muốn. Điều này sẽ chạy trong một vài phút. Phần còn lại của bài viết này được viết RELEASE_360/
và sẽ tải các nguồn vào ~/sourceInstallations/llvm_RELEASE_360/
- Bạn sẽ phải thay thế thẻ thích hợp để phù hợp với các phiên bản trong tương lai. Các thư mục dưới đây của compiler-rt
, libcxx
và libcxxabi
không phải là hoàn toàn cần thiết, nhưng chứa một số tính năng mà LLVM & Clang có mà GCC không, vì vậy mới có trong bài viết này. Có các "dự án con" LLVM khác mà bạn có thể chọn sử dụng, chẳng hạn như dragonegg, LLDB, OpenMB, vmkit, polly, libclc, klee, SAFECode và lld. Bạn có thể đọc về những người trên trang web LLVM .
cd ~/sourceInstallations
svn co http://llvm.org/svn/llvm-project/llvm/tags/RELEASE_360/final llvm_RELEASE_360
cd llvm_RELEASE_360/tools
svn co http://llvm.org/svn/llvm-project/cfe/tags/RELEASE_360/final clang
cd ../projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/tags/RELEASE_360/final compiler-rt
svn co http://llvm.org/svn/llvm-project/libcxx/tags/RELEASE_360/final libcxx
svn co http://llvm.org/svn/llvm-project/libcxxabi/tags/RELEASE_360/final libcxxabi
cd ..
svn update
At revision X.
--- Hopefully this outputs one line saying "At revision X", but numbers instead of "X". If it downloads more source files, a new revision was released while you were downloading the source code. This is highly unlikely unless you're using trunk (the most up to date, maybe unstable code.) But, if this happens, perform a svn update in the tools/clang, projects/compiler-rt, projects/libcxx, projects/libcxxabi, and again ~/sourceInstallations/llvm_RELEASE_360, until you are fully up to date.
-
Xây dựng LLVM & Clang. Điều này sẽ chạy trong một thời gian. Nếu điều này hoàn thành chính xác, dòng cuối cùng bạn sẽ thấy sẽ nói "thành công". Việc nhìn thấy một số thông báo tìm lỗi nhanh chóng là điều bình thường. Luôn luôn là một ý tưởng tốt để xây dựng mọi thứ trong một thư mục khác với một thư mục nguồn.
mkdir ../llvm_RELEASE_360_build
cd ../llvm_RELEASE_360_build
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/usr/local/bin/gcc -DCMAKE_CXX_COMPILER=/usr/local/bin/g++ ../llvm_RELEASE_360 && make && sudo make install && echo success
--- If your VPS has multiple cores, you can speed up the build by changing the middle part
--- of this line from "&& make &&" to "&& make -j <number of cores> &&".
--- You can see the number of cores your VPS has by running "nproc"
--- If you omit -DCMAKE_BUILD_TYPE=Release, the build defaults to debug. This is great if you need to debug LLVM & Clang itself, but slows down compilation of your end programs considerably.
--- If you omit the references to gcc and g++, it will default to using the older binary versions in /usr/bin/, and will not compile.
-
Kiểm tra các phiên bản đã cài đặt và xem vị trí của chúng.
clang --version
May say: clang version 3.6.0 (tags/RELEASE_360/final 237229)
clang++ --version
May say: clang version 3.6.0 (tags/RELEASE_360/final 237229)
which clang
/usr/local/bin/clang
which clang++
/usr/local/bin/clang++
-
Thêm các thư viện mới vào ld (trình liên kết GNU).
echo "/usr/local/lib" > usrLocalLib.conf
sudo mv usrLocalLib.conf /etc/ld.so.conf.d/
sudo ldconfig
--- This may say a file or two "is not an ELF file - it has the wrong magic bytes at the start."
--- You may ignore this message. It is silent about the work it successfully completed.
-
Tùy chọn thực hiện một chương trình "xin chào thế giới".
mkdir ~/code
cd ~/code
Create a file main.cpp that says:
#include <iostream>
using namespace std;
int main() {
cout << "Hello world!" << endl;
return 0;
}
--- One way to create this file is to run "vi main.cpp", hitting "i" to enter insert mode,
--- typing the above file, hitting ESC, and hitting "ZZ" to save.
clang++ main.cpp -o main
./main
Hello World!
clang++ -stdlib=libc++ -lc++abi main.cpp -o main
--- This uses Clang's libc++ and libc++abi, instead of the GNU stdlibc++ and stdlibc++abi
./main
Hello world!
-
Sử dụng LLVM & Clang khi bạn muốn.
You could set LLVM & Clang to be your system's default C and C++ compiler by running:
echo "export CC=/usr/local/bin/gcc" >> ~/.bashrc
echo "export CXX=/usr/local/bin/g++" >> ~/.bashrc
source ~/.bashrc
Once and a while there is a difference between Clang and GCC, but it's becoming more and more rare. To be more conservative, you could specify in your code's buildsystem to use LLVM & Clang, but otherwise leave your system's default to the source build of GCC.
-
Tùy chọn lấy lại dung lượng ổ cứng. ~/sourceInstallations
Thư mục của bạn sẽ chiếm khoảng 11GB dung lượng đĩa. Có thể là khôn ngoan để giữ các thư mục, vì có một số tùy chọn cấu hình tùy chọn mà bạn có thể cần sử dụng tại một thời điểm nào đó trong tương lai và sẽ nhanh hơn khi thực hiện được nhiều việc. Và, như đã đề cập ở trên, có thêm "tiểu dự án" mà bạn có thể thêm vào LLVM & Clang. Ngoài ra, quá trình xây dựng tạo ra các bản ghi mà sau này bạn có thể kiểm tra và làm việc nếu có sự cố. Nhưng, sau khi chạy "sudo make install" trước đó, LLVM & Clang đã cài đặt của bạn không phụ thuộc vào bất cứ thứ gì trong thư mục này và dung lượng có thể ở mức cao, vì vậy bạn có thể thực hiện bước này và lấy lại 11GB.
cd ~/
rm -rf sourceInstallations
--- Again, if you can spare the space, you may someday be happy to have left it there.
Bây giờ bạn có LLVM & Clang mới hơn của bạn, các LLVM & Clang /usr/local/bin
64 bit /usr/local/lib
mới hơn của bạn và LLVM & Clang mới hơn của bạn bao gồm các tệp trong /usr/local/include
.