문제

이 라이브러리를 빌드하고 있습니다. libmyproject.a. 나는 다른 여러 개의 정적 라이브러리 (libone.a 및 libtwo.a)를 포함하므로 libmyproject와 링크하는 응용 프로그램이 libone과 libtwo와 링크 할 필요는 없습니다.

GCC 체인의 새로운 기능입니다.Visual C ++를 사용하면 모든 종속성을 추가하고 내가 원하는 다른 모든 lib도 포함 된 lib도 만들 수 있습니다.

GCC로 어떻게 수행 할 수 있습니까?

보너스 질문 : 나는 스푼을 사용하여 빌드를 사용하고, 스푼이 이것을하기 위해 말할 수있는 방법이 있습니까? 바로 지금은 내가 제공하는 모든 추가 라이브러리를 무시하고 .cpp 파일을 라이브러리로 만 컴파일합니다.

도움이 되었습니까?

해결책

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 함수를 사용하여 라이브러리를 병합 할 수 있습니다.나는 별도의 스크립트를 사용하여 다른 빌드 도구로 명령 줄에서 실행할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top