LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 892|回复: 5

gcc 参数转换的脚本,想了两天了就是搞不定

[复制链接]
发表于 2005-6-11 10:46:39 | 显示全部楼层 |阅读模式
gcc的参数是
-L/usr/local/lib -L/opt/lib/ -L........   -lm -lptrhead -lchm -lX11 -lpcap -lnet

把除(-lm -lpthread)以外的 -l 参数改为对静态库的直接路径 结果应该为

-L/usr/local/lib -L/opt/lib/ -L........   -lm -lptrhead /usr/local/lib/libchm.a /usr/X11/lib/libX11.a /usr/lib/libpcap.a ........

有些静态库的路径需要在-L指定的路径中搜索,不要改变 库的应用顺序
发表于 2005-6-11 15:36:56 | 显示全部楼层
把位置参数分解后,除去以"-L"开头的和-lm -lpthread, 剩下的参数用变量替换中pattern matching的方法去除-l(e.g. ${var#l}, 由于链接库文件的命名结构相对固定,这样只要在前加上"lib"在后加上".a"就行了(e.g. "lib"${var#l}".a")。路径寻找可以用find或locate,然后分析是不是在指定路径中。写写看吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-13 08:51:38 | 显示全部楼层
#!/bin/bash

echo $#
paths="-B /lib /usr/lib /usr/local/lib"                #all paths for library finded
newarg=""                #args after convert
while [ $# -gt 0 ]
do
        case $1 in
        -lm | -lpthread )
        newarg=$newarg" "$1
        ;;
        -l* )
        tmp=`echo $1 | sed 's/-l\(.*\)/ -f lib\1\.a/'|         \
                xargs whereis  $paths | sed 's/ /\n/g' | grep "\.a$"`
        tmp=`echo $tmp        | sed 's/ .*$//'`  
        newarg=$newarg" "$tmp
        echo $1 "->" $tmp
        ;;
        -L* )
        tmp=`echo $1 | sed 's/-L/ /'`
        paths=$paths$tmp
        newarg=$newarg" "$1
        ;;
        * )
        newarg=$newarg" "$1
        ;;
        esac
                               
        shift 1
done

echo $newarg
echo $paths
回复 支持 反对

使用道具 举报

发表于 2005-6-13 10:31:46 | 显示全部楼层
Post by lit_river
#!/bin/bash

echo $#
paths="-B /lib /usr/lib /usr/local/lib"                #all paths for library finded
newarg=""                #args after convert
while [ $# -gt 0 ]
do
        case $1 in
        -lm | -lpthread )
        newarg=$newarg" "$1
        ;;
        -l* )
        tmp=`echo $1 | sed 's/-l\(.*\)/ -f lib\1\.a/'|         \
                xargs whereis  $paths | sed 's/ /\n/g' | grep "\.a$"`
        tmp=`echo $tmp        | sed 's/ .*$//'`  
        newarg=$newarg" "$tmp
        echo $1 "->" $tmp
        ;;
        -L* )
        tmp=`echo $1 | sed 's/-L/ /'`
        paths=$paths$tmp
        newarg=$newarg" "$1
        ;;
        * )
        newarg=$newarg" "$1
        ;;
        esac
                               
        shift 1
done

echo $newarg
echo $paths


不错,兄弟。用sed也是很好的选择。 :2cool
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-13 16:23:01 | 显示全部楼层
唉,贴了N个论坛都没有人理!

用了一个周末的时间才搞定。开始想完全用awk,但是发现实现不聊。

Linux才刚刚学习,以后遇到什么问题还请多多帮忙阿
回复 支持 反对

使用道具 举报

发表于 2005-6-13 23:08:36 | 显示全部楼层
Post by lit_river
唉,贴了N个论坛都没有人理!

用了一个周末的时间才搞定。开始想完全用awk,但是发现实现不聊。

Linux才刚刚学习,以后遇到什么问题还请多多帮忙阿


没问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表