头文件大小写问题的脚本解决方案

linux的文件名是大小写敏感的,所以,我们要将代码中include的头文件大小写做个转换。

手动修改——当我没说……

用脚本去解决,之前我用perl写过这样功能的脚本,但是时间久远,我已经找不到了。

简单分析一下,大概是一下几步

  1. 找到所有的被包含过的头文件,grep/sort/uniq
  2. 对每一个头文件,如果存在,则不处理
  3. 如果不存在,则忽略大小写find -iname,这样会有三种不同的结果,找不到,找到一个和找到多个,将结果分别记录在不同的文件,作为输出结果
  4. 对于找不到的,这个可能是系统文件,也可能是因为别的原因找不到,这需要一个一个的确认
  5. 对于找到一个的,简单的perl替换就可以了,或者sed?我喜欢perl
  6. 对于找到多个的,直接等待手工确认

以上就简单处理了大部分的情况,就此打住,脚本么,简简单单的处理个七七八八就可以了。能处理的就要处理对,不能处理的就记录下来。

根据以往的经验,在一个大而复杂的系统里面,这样的结果可能会出现找到多个的很多,这样就会很麻烦,但也没办法。

一下是shell脚本,经测试,能工作。

#!/bin/bash

workdir=.
modify=0

while [ $# -gt 0 ]
do
    case $1 in
    "--modify")
        modify=1
        ;;
    "--work-dir")
        shift
        workdir=$1
        ;;
    *)
        echo "USAGE: $0 [--work-dir <work-dir>] [--modify] [--help]"
        exit 1
    esac
    shift
done

echo "work-dir: $workdir, modify: $modify"

h_files=$(tempfile)
none_files=files_none
ok_files=files_one
more_files=files_more

>$none_files
>$ok_files
>$more_files

grep -Prsh ‘^\s*#\s*include‘ $workdir | grep -Po ‘\w+\.h‘ | sort | uniq | while read hfile
do
    echo -n .
    if [ $(find $workdir -name "$hfile" | wc -l) -eq 0 ]
    then
        find $workdir -iname "$hfile" | grep -Po ‘\w+\.h$‘ | sort | uniq > $h_files
        file_cnt=$(cat $h_files | wc -l)
        if [ $file_cnt -eq 0 ]
        then
            echo $hfile >> $none_files
        elif [ $file_cnt -eq 1 ]
        then
            newfile=$(cat $h_files)
            echo $hfile ‘->‘ $newfile >> $ok_files
            # for ok, deal it
            if [ $modify -eq 1 ]
            then
                grep -Pril "\b$hfile\b" $workdir | xargs perl -i -pe "s/\b$hfile\b/$newfile/"
            fi
        else
            echo -- $hfile -- >> $more_files
            cat $h_files >> $more_files
        fi
    fi
done

echo Done!
echo the result in file: $none_files, $ok_files and $more_files
时间: 2024-08-24 05:13:32

头文件大小写问题的脚本解决方案的相关文章

【JNI编程】使用javah命令生成头文件报错的解决方案

异常信息: 提示找不到某个类(要进行编译的类) 产生异常的开发环境: jdk7.0 ndk版本: android-ndk-r7b 解决方案: 在环境变量classpath中添加android.jar这个文件的目录 如:E:\eclipse\android-sdks\platforms\android-8\android.jar 问题描述: 刚开始研究JNI,然后让这个问题折腾了一上午,使用javah来生成java的class文件没问题,但是生成包含android特有的类库的class文件就出错,

C/C++混合编程出现:预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)问题的解决方案

今天试了一下C/C++混合编程,然后就出现了上面那个蛋疼的问题,去网上查了一下,发现原来是C语言和C++预编译头的问题. error:预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反) 英文版:fatal error C1853: 'pjtname.pch' precompiled header file is from a previous version of the compiler, or the precompiled header is C++ a

关于在Clion中创建解决方案、项目与源/头文件的解决方法

关于在Clion中创建解决方案.项目与源/头文件的解决方法 在windows端我们经常使用的集成编译器是Microsoft Visual Studio(以下简称VS),一些用户使用mac端时,由于VS不支持macOS,很多人会选择使用虚拟机或者安装双系统来进行工作,但个人感觉这样做会对系统的性能造成一定程度的降低,这里就浅讲一下如何在Clion中创建与VS类似的解决方案 如何在Clion中创建解决方案 Clion由于使用的是波兰的C++编译器,这就导致一些文件内容编码类型的不同.在个人理解中,C

VMVare9.0, Ubuntu12.04安装VMWare Tools找不到内核头文件解决方案

VMVare9.2, Ubuntu14.04安装VMWare Tools 遇到一点问题,提示找不到内核头文件,于是baidu之,作如下总结. 首先执行: sudo apt-get install build-essential linux-headers-$(uname -r) sudo cp /lib/modules/3.13.0-24-generic/build/include/generated/uapi/linux/version.h /lib/modules/3.13.0-24-gen

C语言中,头文件和源文件的关系(转)

简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件)4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息.(生成.exe文件) 编译器在编译时是以C文件为单位进行的,也就是

头文件&lt;ctype.h&gt;

头文件<ctype.h>声明了可以用于识别和转换字符的函数. 一.字符判断函数: 1.函数isalnum int isalnum(int c); 功能:判断变量c是否为字母或数字 返回值:当c为数字0-9或字母a-z及A-Z时,返回非零值,否则返回零. 2.函数isalpha int isalpha(int c); 功能:判断变量c是否为英文字母 返回值:字母返回非0,不是字母返回0. 3.函数iscntrl int iscntrl(int c); 功能:判断字符c是否为控制字符 返回值:当c

(转) C语言头文件、库文件的查找路径

在程序设计中,文件包含是很有用的.一个大的程序可以分为多个模块,由多个程序员分别编程.有        些公    用的符号常量或宏定义等可单独组成一个文件,在其它文件的开头用包含命令包含该文件即可使        用.这样,可避免在每个文件开头都去书写那些公用量,从而节省时间,并减少出错. 对文件包含命令还要说明以下几点:1. 包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来.例如以下写法都是允许的:    #include"stdio.h"    #include   

C/C++常用头文件及函数汇总

C/C++头文件一览 C #include <assert.h> //设定插入点#include <ctype.h> //字符处理#include <errno.h> //定义错误码#include <float.h> //浮点数处理#include <iso646.h>        //对应各种运算符的宏#include <limits.h> //定义各种数据类型最值的常量#include <locale.h> //定

C++的头文件和实现文件分别写什么

在C++编程过程中,随着项目的越来越大,代码也会越来越多,并且难以管理和分析.于是,在C++中就要分出了头(.h)文件和实现(.cpp)文件,并且也有了Package的概念. 对于以C起步,C#作为"母语"的我刚开始跟着导师学习C++对这方面还是感到很模糊.虽然我可以以C的知识面对C++的语法规范,用C#的思想领悟C++中类的使用.但是C#中定义和实现是都在一个文件中(其实都是在类里面),而使用C的时候也只是编程的刚刚起步,所写的程序也只要一个文件就够了.因此对于C++的Package