You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编译与依赖项动态链接的Git?

如何编译动态链接版Git(与发行版一致)

问题背景

我使用以下脚本编译Git:

local gitVersion="2.37.0"
url="https://github.com/git/git/archive/refs/tags/v$gitVersion.tar.gz"

tempDir=$(mktemp -d) &&
        mkdir -p "$tempDir" &&
        (
            cd "$tempDir" &&
                curl -L "$url" -o git.tar.gz &&
                tar -xf git.tar.gz &&
                cd "$tempDir/git-"* &&
                make configure &&
                ./configure --prefix="/usr/local" \
                    --with-curl \
                    --with-expat \
                    --with-openssl \
                    --without-python \
                    --without-tcltk \
                    --sysconfdir=/etc \
                    --with-gitconfig=/etc/gitconfig &&
                make -j all
        )

编译后/usr/local/libexec/git-core目录下的可执行文件体积约21MB,通过ldd检测确认是静态链接导致:

ldd /usr/local/libexec/git-core/git-checkout
        linux-vdso.so.1 (0x00007ffe24991000)
        libz.so.1 => /lib64/libz.so.1 (0x00007fb635ef0000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fb635ce8000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb635ac8000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fb635703000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb636108000)

而发行版预装的Git采用动态链接,依赖更多系统库:

ldd /usr/libexec/git-core/git-checkout
        linux-vdso.so.1 (0x00007fff5755c000)
        libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007ff1a7744000)
        libz.so.1 => /lib64/libz.so.1 (0x00007ff1a752c000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ff1a730c000)
        librt.so.1 => /lib64/librt.so.1 (0x00007ff1a7104000)
        libcrypto.so.1.1 => /lib64/libcrypto.so.1.1 (0x00007ff1a6c1b000)
        libc.so.6 => /lib64/libc.so.6 (0x00007ff1a6856000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ff1a7f56000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007ff1a6652000)

请问如何实现与发行版一致的动态链接效果?Git的configure是否有对应配置选项?


解决方案

1. 核心configure选项调整

Git的默认编译配置会优先静态链接部分依赖,通过以下选项强制启用动态链接:

  • --enable-shared:开启动态链接库的构建
  • --disable-static:禁用静态链接库的构建
  • --with-libpcre2:显式指定使用系统自带的PCRE2库(对应发行版的依赖项)

修改后的configure命令如下:

./configure --prefix="/usr/local" \
    --with-curl \
    --with-expat \
    --with-openssl \
    --with-libpcre2 \
    --without-python \
    --without-tcltk \
    --sysconfdir=/etc \
    --with-gitconfig=/etc/gitconfig \
    --enable-shared \
    --disable-static

2. 完整编译流程

  1. 清理旧编译文件:如果之前安装过静态版Git,先卸载并清理缓存
    sudo make uninstall
    make distclean
    
  2. 安装依赖开发包:确保系统已安装所有依赖的开发文件(不同发行版包名略有差异)
    • RHEL/CentOS系列:
      sudo yum install libcurl-devel expat-devel openssl-devel pcre2-devel zlib-devel
      
    • Debian/Ubuntu系列:
      sudo apt install libcurl4-openssl-dev libexpat1-dev libssl-dev libpcre2-dev zlib1g-dev
      
  3. 重新编译安装:
    make configure &&
    ./configure [上述修改后的完整选项] &&
    make -j$(nproc) &&
    sudo make install
    

3. 验证效果

编译完成后,再次执行ldd命令检查:

ldd /usr/local/libexec/git-core/git-checkout

此时会看到与发行版类似的依赖库列表,可执行文件体积会降至几MB,符合动态链接的预期。


内容的提问来源于stack exchange,提问作者Gabriel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:48:18