代码之家  ›  专栏  ›  技术社区  ›  peoro

仅静态链接某些库

  •  94
  • peoro  · 技术社区  · 14 年前

    在与gcc链接时,如何只静态地将一些特定的库链接到二进制文件?

    gcc ... -static ... 尝试静态链接 全部的 链接的库,但我没有其中一些的静态版本(例如:libx11)。

    8 回复  |  直到 7 年前
        1
  •  101
  •   moorray    11 年前

    gcc -lsome_dynamic_lib code.c some_static_lib.a

        2
  •  45
  •   Dmitry Yudakov    14 年前

    ld -Bdynamic

    gcc <objectfiles> -static -lstatic1 -lstatic2 -Wl,-Bdynamic -ldynamic1 -ldynamic2
    

        3
  •  27
  •   Community CDub    10 年前
    gcc objectfiles -o program -Wl,-Bstatic -ls1 -ls2 -Wl,-Bdynamic -ld1 -ld2
    

    -static-libgcc -static-libstdc++

    libs1.so libs1.a -Wl,-Bstatic -Wl,-Bdynamic -L/libs1-library-location/ -ls1

        4
  •  26
  •   ypnos    9 年前

    ld --static

    # echo "int main() {}" > test.cpp
    # c++ test.cpp /usr/lib/libX11.a
    # ldd a.out
    linux-vdso.so.1 =>  (0x00007fff385cc000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f9a5b233000)
    libm.so.6 => /lib/libm.so.6 (0x00007f9a5afb0000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f9a5ad99000)
    libc.so.6 => /lib/libc.so.6 (0x00007f9a5aa46000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f9a5b53f000)
    

    libX11

    .so

        5
  •  17
  •   jcoffland    12 年前

    1. <

    #!/bin/bash
    
    if [ $# -eq 0 ]; then
        echo "Usage: $0 [--exclude <lib_name>]. . . <link_command>"
    fi
    
    exclude=()
    lib_path=()
    
    while [ $# -ne 0 ]; do
        case "$1" in
            -L*)
                if [ "$1" == -L ]; then
                    shift
                    LPATH="-L$1"
                else
                    LPATH="$1"
                fi
    
                lib_path+=("$LPATH")
                echo -n "\"$LPATH\" "
                ;;
    
            -l*)
                NAME="$(echo $1 | sed 's/-l\(.*\)/\1/')"
    
                if echo "${exclude[@]}" | grep " $NAME " >/dev/null; then
                    echo -n "$1 "
                else
                    LIB="$(gcc $lib_path -print-file-name=lib"$NAME".a)"
                    if [ "$LIB" == lib"$NAME".a ]; then
                        echo -n "$1 "
                    else
                        echo -n "\"$LIB\" "
                    fi
                fi
                ;;
    
            --exclude)
                shift
                exclude+=(" $1 ")
                ;;
    
            *) echo -n "$1 "
        esac
    
        shift
    done
    
    echo
    

    mostlyStatic gcc -o test test.c -ldl -lpthread
    

    gcc -o test test.c "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libdl.a" "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libpthread.a"
    

    mostlyStatic --exclude dl gcc -o test test.c -ldl -lpthread
    

    gcc -o test test.c -ldl "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libpthread.a"
    
        6
  •  5
  •   osgx    8 年前

    -l:libstatic1.a https://stackoverflow.com/a/20728782 https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

    -llibrary
    -l library 
    

    -lname libname.so libname.a .so .a -l:name https://sourceware.org/binutils/docs/ld/Options.html

    -l namespec
    --library=namespec
    

    namespec :filename filename libnamespec.a

    libnamespec.so

    -(

    -l:namespec https://sourceware.org/binutils/docs-2.18/ld/Options.html

        7
  •  3
  •   Jonathan Leffler    14 年前

        8
  •  1
  •   Vincent    7 年前

    gcc -lssl main.o -lFooLib -o main