注意事项:
1. 内存8G以上,我当时4G内存,编译debug版就出现了内存耗尽的情况;
2.最好不要编译debug版本,我编译到83%左右时已经耗尽30多G磁盘空间,并且会产生很大的编译日志文件(提示12G左右),同样提示内存不足
针对内存耗尽的问题,当时也在网上找了很久,来自于stackoverflow(https://stackoverflow.com/questions/25197570/llvm-clang-compile-error-with-memory-exhausted)的回答:
- Add more RAM to your VM, or
- Use gold instead of ld as a linker, or (sudo ln -s `which gold` /usr/local/bin/ld)
- Build Release, not Debug build
If you would like to check out and build Clang, the current procedure is as follows:
- Get the required tools.
- See Getting Started with the LLVM System - Requirements.
- Note also that Python is needed for running the test suite. Get it at: http://www.python.org/download
- Standard build process uses CMake. Get it at: http://www.cmake.org/download
- Check out LLVM:
- Change directory to where you want the llvm directory placed.
- svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
- Check out Clang:
- cd llvm/tools
- svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
- cd ../..
- Check out extra Clang tools: (optional)
- cd llvm/tools/clang/tools
- svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
- cd ../../../..
- Check out Compiler-RT (optional):(不需要)
- cd llvm/projects
- svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
- cd ../..
- Check out libcxx: (only required to build and run Compiler-RT tests on OS X, optional otherwise)(不需要)
- cd llvm/projects
- svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
- cd ../..
- Build LLVM and Clang:
- mkdir build (in-tree build is not supported)
- cd build
- cmake -G "Unix Makefiles" ../llvm(最好用 cmake -G "Unix Makefiles"-DCMAKE_BUILD_TYPE:String=Release ../llvm, 编译release版本,debug版本有三十多G)
- make
- This builds both LLVM and Clang for debug mode.
- Note: For subsequent Clang development, you can just run make clang.
- CMake allows you to generate project files for several IDEs: Xcode, Eclipse CDT4, CodeBlocks, Qt-Creator (use the CodeBlocks generator), KDevelop3. For more details see Building LLVM with CMake page.
- If you intend to use Clang's C++ support, you may need to tell it how to find your C++ standard library headers. In general, Clang will detect the best version of libstdc++ headers available and use them - it will look both for system installations of libstdc++ as well as installations adjacent to Clang itself. If your configuration fits neither of these scenarios, you can use the -DGCC_INSTALL_PREFIX cmake option to tell Clang where the gcc containing the desired libstdc++ is installed.
- Try it out (assuming you add llvm/build/bin to your path):
- clang --help
- clang file.c -fsyntax-only (check for correctness)
- clang file.c -S -emit-llvm -o - (print out unoptimized llvm code)
- clang file.c -S -emit-llvm -o - -O3
- clang file.c -S -O3 -o - (output native machine code)
- Run the testsuite:(不需要)
- make check-clang
- make check-clang
#include <iostream>
#include <clang-c/Index.h>
using namespace std;
ostream& operator<<(ostream& stream, const CXString& str)
{
stream << clang_getCString(str);
clang_disposeString(str);
return stream;
}
int main()
{
CXIndex index = clang_createIndex(0, 0);
CXTranslationUnit unit = clang_parseTranslationUnit(
index,
"header.hpp", nullptr, 0,
nullptr, 0,
CXTranslationUnit_None);
if (unit == nullptr)
{
cerr << "Unable to parse translation unit. Quitting." << endl;
exit(-1);
}
CXCursor cursor = clang_getTranslationUnitCursor(unit);
clang_visitChildren(
cursor,
[](CXCursor c, CXCursor parent, CXClientData client_data)
{
cout << "Cursor '" << clang_getCursorSpelling(c) << "' of kind '"
<< clang_getCursorKindSpelling(clang_getCursorKind(c)) << "'\n";
return CXChildVisit_Recurse;
},
nullptr);
clang_disposeTranslationUnit(unit);
clang_disposeIndex(index);
}
header.hpp
enum class Cpp11Enum
{
RED = 10,
BLUE = 20
};
struct Wowza
{
virtual ~Wowza() = default;
virtual void foo(int i = 0) = 0;
};
struct Badabang : Wowza
{
void foo(int) override;
bool operator==(const Badabang& o) const;
};
template <typename T>
void bar(T&& t);