linux到solaris程序的移植问题


对一个c程序来说,比较头疼的问题就是程序的移植.一个普通的socket程序,linux下编译没问题,在SunOs 5.8 Generic_108528-19上报错:


bash-2.05# make


gcc -o receive receive.o init_daemon.o readconf.o trimchar.o


Undefined first referenced


symbol in file


socket receive.o


accept receive.o


bind receive.o


inet_ntop receive.o


vsscanf readconf.o


listen receive.o


ld: fatal: Symbol referencing errors. No output written to receive


collect2: ld returned 1 exit status


make: *** [receive] Error 1


[@more@]



这里面大体蕴涵着两方面的问题:




  1. 编译的格式不同.linux中gcc语法要求比较宽松,而solaris比较苛刻,要求必须指明所需要的库路径.以上bind和accept相关的函数都包含在socket库里.所以要加上"-lsocket",为了防止有其他函数库也找不到,最好也加上"-lnsl".


  2. 加上这些选项就只有vsscanf函数报错了




查询链接库的知识点:




  • nm: 库文件中的符号表,当不清楚某个函数在哪个库函数中时,可以用"nm -o /lib/* /usr/lib/* /usr/lib/*/* /usr/local/lib/* 2> /dev/null|grep vssanf "来查找.


  • ar : 归档命令.增加,减少库函数时有用,比如看看库中有哪些object文件."ar -t lib.a"


  • ldd: 显示共享库的依赖情况.说明运行这个文件需要系统有哪些库函数.



教训:




  • 以后写c程序一定尽量使用标准的东西.移植时省却很多麻烦


  • 很多时候并不是系统移植的问题,操作习惯或者命令格式的使用更是移植的拦路虎.


  • 对将要移植系统环境的熟悉程度是移植成败的关键.

评论

此博客中的热门博文

如何更改google reader的默认语言

SVN PROPFIND Request Failed

查看网卡流量的脚本