ccls 靜態(tài)編譯

環(huán)境 ArchLinux

pacman -S archlinuxcn/clang-git archlinuxcn/polly-git
git clone --depth 1 --recursive https://github.com/MaskRay/ccls

然后更改 CLANG_LINK_CLANG_DYLIB 相關(guān)的條件語(yǔ)句,把動(dòng)態(tài)鏈接庫(kù)刪掉,只留下靜態(tài)庫(kù)

執(zhí)行 cmake -B build

更改 CMakeFiles/ccls.dir/link.txt,將其中帶 so 后綴的盡可能改成 a 文件。并且添加 -static-libstdc++ -static-libgcc 例如:

/usr/lib/ccache/bin/c++ -O3 -DNDEBUG CMakeFiles/ccls.dir/third_party/siphash.cc.o CMakeFiles/ccls.dir/src/clang_tu.cc.o CMakeFiles/ccls.dir/src/config.cc.o CMakeFiles/ccls.dir/src/filesystem.cc.o CMakeFiles/ccls.dir/src/fuzzy_match.cc.o CMakeFiles/ccls.dir/src/main.cc.o CMakeFiles/ccls.dir/src/include_complete.cc.o CMakeFiles/ccls.dir/src/indexer.cc.o CMakeFiles/ccls.dir/src/log.cc.o CMakeFiles/ccls.dir/src/lsp.cc.o CMakeFiles/ccls.dir/src/message_handler.cc.o CMakeFiles/ccls.dir/src/pipeline.cc.o CMakeFiles/ccls.dir/src/platform_posix.cc.o CMakeFiles/ccls.dir/src/platform_win.cc.o CMakeFiles/ccls.dir/src/position.cc.o CMakeFiles/ccls.dir/src/project.cc.o CMakeFiles/ccls.dir/src/query.cc.o CMakeFiles/ccls.dir/src/sema_manager.cc.o CMakeFiles/ccls.dir/src/serializer.cc.o CMakeFiles/ccls.dir/src/test.cc.o CMakeFiles/ccls.dir/src/utils.cc.o CMakeFiles/ccls.dir/src/working_files.cc.o CMakeFiles/ccls.dir/src/messages/ccls_call.cc.o CMakeFiles/ccls.dir/src/messages/ccls_info.cc.o CMakeFiles/ccls.dir/src/messages/ccls_inheritance.cc.o CMakeFiles/ccls.dir/src/messages/ccls_member.cc.o CMakeFiles/ccls.dir/src/messages/ccls_navigate.cc.o CMakeFiles/ccls.dir/src/messages/ccls_reload.cc.o CMakeFiles/ccls.dir/src/messages/ccls_vars.cc.o CMakeFiles/ccls.dir/src/messages/initialize.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_code.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_completion.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_definition.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_did.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_foldingRange.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_formatting.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_document.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_hover.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_references.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_rename.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_signatureHelp.cc.o CMakeFiles/ccls.dir/src/messages/workspace.cc.o -o ccls  /usr/lib/libclangIndex.a /usr/lib/libclangFormat.a /usr/lib/libclangTooling.a /usr/lib/libclangToolingInclusions.a /usr/lib/libclangToolingCore.a /usr/lib/libclangFrontend.a /usr/lib/libclangParse.a /usr/lib/libclangSerialization.a /usr/lib/libclangSema.a /usr/lib/libclangAST.a /usr/lib/libclangLex.a /usr/lib/libclangDriver.a /usr/lib/libclangBasic.a /usr/lib/libLLVMOption.a /usr/lib/libLLVMSupport.a /usr/lib/libclangFormat.a /usr/lib/libclangToolingInclusions.a /usr/lib/libclangToolingCore.a /usr/lib/libclangEdit.a /usr/lib/libclangAnalysis.a /usr/lib/libclangRewrite.a /usr/lib/libclangASTMatchers.a /usr/lib/libclangAST.a /usr/lib/libclangLex.a /usr/lib/libclangBasic.a /usr/lib/libLLVM-15.so /usr/lib/librt.a /usr/lib/libdl.a -lm /usr/lib/libz.a /usr/lib/libtinfo.so /usr/lib/libLLVMDemangle.a -static-libstdc++ -static-libgcc

執(zhí)行 make

這時(shí)編譯出來(lái)的 ccls 大概 46MB,然后執(zhí)行

ldd ccls | awk {'print $1'} | xargs -I {} cp -L -n '/usr/lib/{}' .

然后把拷貝失敗的庫(kù)手動(dòng)拷貝一下

然后執(zhí)行:

sed -i -e 's#/usr#././#g' ccls
sed -i -e 's#/lib64#././#g' ccls

這時(shí)的 ccls 就是完全沒(méi)依賴(lài)的了。執(zhí)行的時(shí)候需要加上 export LD_LIBRARY_PATH=\pwd`:$PATH`

然后執(zhí)行的時(shí)候告訴我內(nèi)核版本太低。md

file 看一下可以知道內(nèi)核版本

下面是 Fedora 下失敗的產(chǎn)物,不用看

LspInstall 沒(méi)有 ccls,原因是 ccls 沒(méi)有提供 build。所以我在這里記一下編譯方式,有空做個(gè) github action,然后給 lspinstall 提個(gè) pr。理想情況下是把代碼合并到 ccls 中

首先是 clone:

git clone --depth 1 --recursive https://github.com/MaskRay/ccls

然后安裝依賴(lài)和靜態(tài)庫(kù):

dnf in clang-devel llvm-devel libstdc++-static.x86_64 glibc-static llvm-static

然后進(jìn)入 ccls 中,執(zhí)行

cmake -B build/Release -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS='-static'
cmake --build build/Release

報(bào)錯(cuò):

/usr/bin/ld: 試圖靜態(tài)鏈結(jié)的動(dòng)態(tài)對(duì)象 /usr/lib64/libclang-cpp.so.13

這個(gè)庫(kù)文件是 clang-libs 提供的,F(xiàn)edora 的描述為:

| clang-libs.x86_64 : Runtime library for clang

因此沒(méi)有靜態(tài)庫(kù)

原因是在 CMakeLists 中的第 74,75 行:

if(CLANG_LINK_CLANG_DYLIB)
  target_link_libraries(ccls PRIVATE clang-cpp)

但是即使是加了 -DCLANG_LINK_CLANG_DYLIB=OFF 也沒(méi)用。細(xì)看發(fā)現(xiàn)上文沒(méi)有 option(CLANG_LINK_CLANG_DYLIB)

git clone --depth 1 --recursive https://github.com/llvm/llvm-project.git
cmake -Hllvm -BRelease -G Ninja -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_ENABLE_PROJECTS=clang
ninja -C Release clangFormat clangFrontendTool clangIndex clangTooling clang

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容