ccls 静态编译

环境 ArchLinux

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

然后更改 CLANG_LINK_CLANG_DYLIB 相关的条件语句,把动态链接库删掉,只留下静态库

执行 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

执行 make

这时编译出来的 ccls 大概 46MB,然后执行

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

然后把拷贝失败的库手动拷贝一下

然后执行:

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

这时的 ccls 就是完全没依赖的了。执行的时候需要加上 export LD_LIBRARY_PATH=\pwd`:$PATH`

然后执行的时候告诉我内核版本太低。md

file 看一下可以知道内核版本

下面是 Fedora 下失败的产物,不用看

LspInstall 没有 ccls,原因是 ccls 没有提供 build。所以我在这里记一下编译方式,有空做个 github action,然后给 lspinstall 提个 pr。理想情况下是把代码合并到 ccls 中

首先是 clone:

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

然后安装依赖和静态库:

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

然后进入 ccls 中,执行

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

报错:

/usr/bin/ld: 试图静态链结的动态对象 /usr/lib64/libclang-cpp.so.13

这个库文件是 clang-libs 提供的,Fedora 的描述为:

| clang-libs.x86_64 : Runtime library for clang

因此没有静态库

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

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

但是即使是加了 -DCLANG_LINK_CLANG_DYLIB=OFF 也没用。细看发现上文没有 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容