Fusionner plusieurs bibliothèques statiques en un seul GCC
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.
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.