源代碼安裝
如果要自定義規(guī)則,那么必須下載源碼進(jìn)行安裝:
- clone源碼:
cd ~/Documents
git clone https://github.com/oclint/oclint.git
cd oclint
# 檢出tag中的v0.13.1版本到為v0.13.1分支
git checkout -B v0.13.1 v0.13.1
- 進(jìn)入oclint-scripts目錄執(zhí)行make腳本:
cd oclint-scripts
./make
- 編譯成功后犹芹,會(huì)有以下路徑:
~/Documents/oclint/build/oclint-release
這個(gè)就是編譯好的oclint灶壶,我們還需要把這個(gè)路徑添加到系統(tǒng)的PATH中首有,在.bash_profile中添加:
OCLINT_HOME=~/Documents/oclint/build/oclint-release
export PATH=$OCLINT_HOME/bin:$PATH
- 進(jìn)入~/Documents/oclint/build/oclint-release目錄蝗锥,執(zhí)行:
cp ~/Documents/oclint/build/oclint-release/bin/oclint* /usr/local/bin/
ln -s ~/Documents/oclint/build/oclint-release/lib/oclint /usr/local/lib
ln -s ~/Documents/oclint/build/oclint-release/lib/clang /usr/local/lib
這里使用ln -s,把lib中的clang和oclint軟鏈接到/usr/local/lib中嗤锉,是為了后面自己編寫rule能快速的更新/usr/local/lib中對應(yīng)的oclint庫,而不需要每次更新自定義rule庫,又要手動(dòng)copy到/usr/local/lib。
- 重啟啟動(dòng)終端,然后輸入:
oclint --version
出現(xiàn)以下打印信息說明安裝成功:
image.png
make中遇到的錯(cuò)誤
make可能出現(xiàn)錯(cuò)誤:
.
1、 需要提前安裝cmake鼓择、ninja,在終端執(zhí)行brew install cmake ninja
2通危、編譯失敗,llvm問題:把version.py中的llvm_latest_release_branch改為最新clang版本(tags/RELEASE_700/final)灌曙,重新./make可以解決這個(gè)問題菊碟。
3、編譯錯(cuò)誤/Users/laiyoung_/OCLint/oclint-0.13.1/oclint-driver/main.cpp:181:38: error: no viable conversion from 'void (*)()' to 'llvm::cl::VersionPrinterTy' (aka 'function<void (llvm::raw_ostream &)>') llvm::cl::AddExtraVersionPrinter(&oclintVersionPrinter); ^~~~~~~~~~~~~~~~~~~~~
解決辦法:去main.cpp源代碼中刪除llvm::cl::AddExtraVersionPrinter(&oclintVersionPrinter);
4在刺、Undefined symbols for architecture x86_64: "clang::cross_tu::IndexError::ID", referenced from: clang::ento::AnyFunctionCall::getRuntimeDefinition() const in libclangStaticAnalyzerCore.a(CallEvent.cpp.o) "clang::cross_tu::CrossTranslationUnitContext::getCrossTUDefinition(clang::FunctionDecl const*, llvm::StringRef, llvm::StringRef)", referenced from: clang::ento::AnyFunctionCall::getRuntimeDefinition() const in libclangStaticAnalyzerCore.a(CallEvent.cpp.o) "clang::cross_tu::CrossTranslationUnitContext::emitCrossTUDiagnostics(clang::cross_tu::IndexError const&)", referenced from: clang::ento::AnyFunctionCall::getRuntimeDefinition() const in libclangStaticAnalyzerCore.a(CallEvent.cpp.o) "clang::cross_tu::CrossTranslationUnitContext::CrossTranslationUnitContext(clang::CompilerInstance&)", referenced from: clang::ento::CreateAnalysisConsumer(clang::CompilerInstance&) in libclangStaticAnalyzerFrontend.a(AnalysisConsumer.cpp.o) "clang::cross_tu::CrossTranslationUnitContext::~CrossTranslationUnitContext()", referenced from: (anonymous namespace)::AnalysisConsumer::~AnalysisConsumer() in libclangStaticAnalyzerFrontend.a(AnalysisConsumer.cpp.o) ld: symbol(s) not found for architecture x86_64 clang-7: error: linker command failed with exit code 1 (use -v to see invocation) ninja: build stopped: subcommand failed.
解決辦法:oclint-driver下CMakeLists中的TARGET_LINK_LIBRARIES段添加clangCrossTU逆害、clangIndex字段