gcc/g++ option to place all object files into separate directory

后端 未结 10 557
无人及你
无人及你 2020-11-30 19:44

I am wondering why gcc/g++ doesn\'t have an option to place the generated object files into a specified directory.

For example:

mkdir builddir
mkdir          


        
10条回答
  •  情深已故
    2020-11-30 20:20

    You can use a simple wrapper around gcc that will generate the necessary -o options and call gcc:

    $ ./gcc-wrap -c file1.c file2.c file3.c --outdir=obj 
    gcc -o obj/file1.o -c file1.c
    gcc -o obj/file2.o -c file2.c
    gcc -o obj/file3.o -c file3.c
    

    Here is such a gcc_wrap script in its simplest form:

    #!/usr/bin/perl -w
    
    use File::Spec;
    use File::Basename;
    use Getopt::Long;
    Getopt::Long::Configure(pass_through);
    
    my $GCC = "gcc";
    my $outdir = ".";
    GetOptions("outdir=s" => \$outdir)
        or die("Options error");
    
    my @c_files;
    while(-f $ARGV[-1]){
        push @c_files, pop @ARGV;
    }
    die("No input files") if(scalar @c_files == 0);
    
    foreach my $c_file (reverse @c_files){
        my($filename, $c_path, $suffix) = fileparse($c_file, ".c");
        my $o_file = File::Spec->catfile($outdir, "$filename.o");
        my $cmd = "$GCC -o $o_file @ARGV $c_file";
        print STDERR "$cmd\n";
        system($cmd) == 0 or die("Could not execute $cmd: $!");
    }
    

    Of course, the standard way is to solve the problem with Makefiles, or simpler, with CMake or bakefile, but you specifically asked for a solution that adds the functionality to gcc, and I think the only way is to write such a wrapper. Of course, you could also patch the gcc sources to include the new option, but that might be hard.

提交回复
热议问题