将多个静态库合并到一个GCC scons中

时间:2011-05-14 10:07:10

标签: gcc static linker scons ar

我正在构建这个库libmyproject.a 我希望它包含其他几个静态库(libone.a和libtwo.a),以便与libmyproject链接的应用程序也不必与libone和libtwo链接。

我是GCC连锁店的新手。使用Visual C ++,我只需添加所有依赖项,它将创建一个lib,其中还包含我想要的所有其他库。

如何使用GCC实现这一目标?

奖金问题:我正在使用scons构建,有没有办法告诉scons这样做? 现在它只是忽略了我提供的所有其他库,只将.cpp文件编译到库中。

1 个答案:

答案 0 :(得分:2)

您必须使用 ar binutils)来处理存档文件。我使用一个简单的Perl脚本来进行合并:

#!/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;

在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])

当然,您可以在SCons中使用Python函数合并库。我更喜欢使用单独的脚本,因此它可以像任何其他构建工具一样从命令行运行。