Question

Je construis cette bibliothèque, libmyproject.A Je veux qu'il inclue plusieurs autres bibliothèques statiques (libone.a et libtwo.a), de sorte que l'application qui relie avec Libmyproject n'a pas à lier avec Libone et Libtwo.

Je suis nouveau dans la chaîne GCC. Avec Visual C ++, j'ajouterais simplement toutes les dépendances et cela créerait une lib qui inclut également toutes les autres LIB que je veux.

Comment puis-je accomplir cela avec GCC?

Une question de bonus: j'utilise des échecs pour construire, y a-t-il un moyen de dire à SCONS de le faire? À l'heure actuelle, il ignore simplement toutes les LIB supplémentaires que je fournit et ne compile que les fichiers .cpp dans la bibliothèque.

Était-ce utile?

La solution

Vous devez utiliser ardente (binutiles) pour les opérations sur des fichiers d'archives. J'utilise un script Perl simple pour faire la fusion:

#!/usr/bin/perl

use warnings;
use strict;
use File::Temp qw(tempdir);
use File::Basename;
use Getopt::Long;

my %opt;
if (!GetOptions(\%opt,
                "dest=s",
               )) {
  die "Invalid option!";
}


my $tempdir = tempdir( CLEANUP => 1 );

if (!chdir($tempdir)) {
    die "Couldn't change directories to `$tempdir': $!";
}

foreach my $lib (@ARGV) {
    my $subdir = $tempdir . '/' . basename($lib);
    mkdir($subdir) or die "Unable to make $subdir: $!";
    chdir($subdir) or die "Unable to cd $subdir: $!";
    system("ar x $lib");
}
chdir($tempdir) or die "Unable to cd $tempdir: $!";
system("ar cr $opt{dest} */*.o") == 0 or die "'ar cr' failed: $?";
system("ranlib $opt{dest}") == 0 or die "'ranlib' failed: $?";

exit 0;

Pour invoquer le script dans SCONS:

# this can be put to site_scons/site_init.py
def MergeLibs(env, target, sources):
    """Rapack multiple archive files into one."""
    merge_libs_tool = os.path.join('$TOOLS_DIR', 'merge_libraries.pl')
    lib = env.Command('${LIBPREFIX}' + target + '${LIBSUFFIX}', [merge_libs_tool] + sources,
            '$SOURCE -dest ${TARGET.abspath} ${SOURCES[1:].abspath}')
    return lib

# lib_one = env.StaticLibrary(...)
# lib_two = env.StaticLibrary(...)
# merged_lib = env.MergeLibs('myproject', [libone, libtwo])

Bien sûr, vous pouvez fusionner des bibliothèques à l'aide de la fonction Python à l'intérieur des cris. Je préfère utiliser un script séparé, il peut donc être exécuté à partir de la ligne de commande comme tout autre outil de construction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top