Vra

Ek het 'n klein stukkie van die kode wat afhanklik is van baie statiese biblioteke (a_1-a_n). Ek wil graag verpak up wat kode in 'n statiese biblioteek en maak dit beskikbaar na ander mense.

My statiese biblioteek, kan dit noem X, stel fyn.

Ek het 'n eenvoudige voorbeeld program wat 'n funksie van X gebruik gemaak, maar toe ek probeer om dit te koppel aan X, kry ek baie foute oor vermiste simbole van biblioteke a_1 -. A_n

Is daar 'n manier dat ek 'n nuwe statiese biblioteek, Y dat X en al die funksies wat nodig is deur X bevat kan skep (gekies stukkies van a_1 - a_n), sodat ek net kan versprei Y vir mense om hul programme te skakel na ?


UPDATE:

Ek het gekyk na net storting alles met ar en maak een mega-lib egter dat beland insluitend 'n baie simbole wat nie nodig is (al die .o lêers is ongeveer 700 MB egter 'n staties gekoppel uitvoerbare is 7 MB). Is daar 'n mooi manier om in te sluit net wat werklik nodig?


Dit lyk nou verwant aan hoe om 'n paar C / C ++ biblioteke te kombineer in een? .

Was dit nuttig?

Oplossing

Static biblioteke skakel nie met ander statiese biblioteke. Die enigste manier om dit te doen, is om jou bibliotekaris / gebruik archiver instrument (byvoorbeeld ar op Linux) om 'n enkele nuwe statiese biblioteek te skep deur concatenating die verskeie biblioteke.

Edit: In reaksie op jou werk, die enigste manier wat ek weet net die simbole wat nodig is om die biblioteek met die hand skep van die subset van die .o lêers wat hulle bevat kies. Dit is moeilik, tydrowend en fout geneig. Ek is nie bewus van enige gereedskap om te help nie hierdie (nie te sê dat hulle nie bestaan ??nie), maar dit sou nogal 'n interessante projek te produseer een te maak.

Ander wenke

As jy met behulp van Visual Studio dan ja, kan jy dit doen.

Die biblioteek bouer instrument wat kom met Visual Studio kan jy biblioteke saam aan te sluit op die command line. Ek weet nie van enige manier om dit te doen in die visuele redakteur though.

lib.exe /OUT:compositelib.lib  lib1.lib lib2.lib

Op Linux of MinGW, met GNU tool chain:

ar -M <<EOM
    CREATE libab.a
    ADDLIB liba.a
    ADDLIB libb.a
    SAVE
    END
EOM
ranlib libab.a

Van as jy doen nie verwyder liba.a en libb.a, kan jy 'n "dun argief" maak:

ar crsT libab.a liba.a libb.a

Op Windows, met MSVC tool chain:

lib.exe /OUT:libab.lib liba.lib libb.lib

'n statiese biblioteek is net 'n argief van .o voorwerp lêers. Uittreksel hulle met ar (met die aanvaarding Unix) en pak dit weer terug in een groot biblioteek.

As alternatief tot Link Library Dependencies in projek eienskappe daar is nog 'n manier om te skakel biblioteke in Visual Studio.

  1. Open die projek van die biblioteek (X) wat jy wil gekombineer word met ander biblioteke.
  2. Voeg die ander biblioteke wat jy wil gekombineer met 'n X (Right Click, Add Existing Item...).
  3. Gaan na hul eienskappe en maak seker Item Type is Library

Dit sluit die ander biblioteke in X asof jy hardloop

lib /out:X.lib X.lib other1.lib other2.lib

Let wel voor jy lees die res: Die dop script wat hier gewys word, is beslis nie veilig om te gebruik en goed getoets. Gebruik op eie risiko!

Ek het 'n bash script om daardie taak uit te voer. Veronderstel jou biblioteek is lib1 en die een wat jy nodig het om 'n paar simbole sluit uit is lib2. Die script loop nou in 'n lus, waar dit die eerste tjeks wat simbole van lib1 ongedefinieerd kan gevind word in lib2. Dit uittreksels dan die ooreenstemmende voorwerp lêers van lib2 met ar, herbenoem hulle 'n bietjie, en sit hulle in lib1. Nou is daar dalk meer ontbreek simbole, want die dinge wat jy ingesluit vanaf lib2 moet ander dinge uit lib2, wat ons nog nie ingesluit, sodat die lus moet weer uit te voer. As jy na 'n paar passe van die lus daar is geen verandering nie, dit wil sê geen voorwerp lêers van lib2 bygevoeg lib1, die lus kan stop.

Let wel, dat die ingesluit simbole nog gerapporteer as undefined deur nm, so ek hou van die voorwerp lêers, wat aan lib1 bygevoeg, hulself, ten einde vas te stel of die lus kan gestop word.

#! /bin/bash

lib1="$1"
lib2="$2"

if [ ! -e $lib1.backup ]; then
    echo backing up
    cp $lib1 $lib1.backup
fi

remove_later=""

new_tmp_file() {
    file=$(mktemp)
    remove_later="$remove_later $file"
    eval $1=$file
}
remove_tmp_files() {
    rm $remove_later
}
trap remove_tmp_files EXIT

find_symbols() {
    nm $1 $2 | cut -c20- | sort | uniq 
}

new_tmp_file lib2symbols
new_tmp_file currsymbols

nm $lib2 -s --defined-only > $lib2symbols

prefix="xyz_import_"
pass=0
while true; do
    ((pass++))
    echo "Starting pass #$pass"
    curr=$lib1
    find_symbols $curr "--undefined-only" > $currsymbols
    changed=0
    for sym in $(cat $currsymbols); do
        for obj in $(egrep "^$sym in .*\.o" $lib2symbols | cut -d" " -f3); do
            echo "  Found $sym in $obj."
            if [ -e "$prefix$obj" ]; then continue; fi
            echo "    -> Adding $obj to $lib1"
            ar x $lib2 $obj
            mv $obj "$prefix$obj"
            ar -r -s $lib1 "$prefix$obj"
            remove_later="$remove_later $prefix$obj"
            ((changed=changed+1))
        done
    done
    echo "Found $changed changes in pass #$pass"

    if [[ $changed == 0 ]]; then break; fi
done

Ek vernoem wat script libcomp, sodat jy dit dan kan noem bv met

./libcomp libmylib.a libwhatever.a

waar libwhatever is waar jy wil simbole van sluit. Maar ek dink dit is die veiligste om alles eers kopieer na 'n aparte gids. Ek sou nie my skrif soveel vertrou (maar dit het gewerk vir my, ek kan die volgende insluit libgsl.a in my numeriese vereistes biblioteek met wat en laat dit -lgsl samesteller skakelaar).

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top