用perl脚本整理头文件引用

这篇博客探讨了在项目开发中,由于子目录下的头文件直接被include导致编译时间延长的问题。作者提出了一种解决方案,即使用Perl脚本将所有头文件的引用路径改为基于根目录的相对路径,以此减少编译时的-I选项,提高编译效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

问题

我们项目开发过程中,会建立很多不同的子目录,子目录下面有很多头文件, 大家一般会在编译的时候用-I 选项来包含这些子目录,然后在源文件中直接include这个目录, 如下所示

  • root
    • sub1
      • foo.h
      • foo.cpp
    • sub2
      • bar.cpp
//in bar.cpp
#include "foo.h"

这样做的坏处是随着目录的增加,编译的时候会引用很多头文件,延长了编译时间。

解决方案

下面这个脚本是把所有头文件改成基于根目录的相对路径,这样就不用加很多-I选项。

#!/usr/bin/perl

use warnings;
use File::Find;

use File::Basename;
use Data::Dumper;
my $data = `find . -name "*.h"`;
# print "$data";
my @headers = split('\n', $data);
my @hppheard2 = split('\n',`find . -name "*.hpp"`);
push(@headers, @hppheard2);

my %newheaders;
foreach my $val (@headers) {
  $file1 = substr($val, 2); 
  $basename = basename($file1);
  $newheaders{$basename} = '<'.$file1.'>';
  # print "$file1, $basename\n";
}
print Dumper(\%newheaders);

my @headerKeys = keys %newheaders;

sub process_file {
    next if (($_ eq '.') || ($_ eq '..'));

    
    my $file = $File::Find::name;
    if (/\.h$/ || /\.cpp$/ || /\.hpp$/)
    {
        print "$file\n" if -f;
        rename($file, $file.'.bak');
        open(IN, '<'.$file.'.bak') or die $!;
        open(OUT, '>'.$file) or die $!;
        while(<IN>)
        {
          for my $key (@headerKeys) {
              # print "The color of '$fruit' is $color_of{$fruit}\n";
              $_ =~ s/"$key"/$newheaders{$key}/g;
          }
            
          print OUT $_;
        }
        close(IN);
        close(OUT);
        `rm $file.bak`;
    }
    
}
find({ wanted => \&process_file, no_chdir => 1 }, "./");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值