This page looks plain and unstyled because you're using a non-standard compliant browser. To see it in its best form, please upgrade to a browser that supports web standards. It's free and painless.

林中求马 爰居爰处?爰丧其马? 予以求之?于林之下。
2010 八月 16, 星期一 林中求马 | 观点透视 [32] | 聚焦互联网 [28] | 生活轨迹 [24] | 國學精粹 [18] | 散文游记 [14] | 休闲娱乐 [13] | 听我讲故事 [6] | 图片库

«cvs web管理软件cvstrac的使用 | weblogic数据库操作的排查与优化»

linux到solaris程序的移植问题

calfen | 30 八月, 2005 13:34 (2327 Reads)

对一个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


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

  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程序一定尽量使用标准的东西.移植时省却很多麻烦
  • 很多时候并不是系统移植的问题,操作习惯或者命令格式的使用更是移植的拦路虎.
  • 对将要移植系统环境的熟悉程度是移植成败的关键.

文章真實引用網址:http://blog.luluchina.com/blog/trackback.php?id=29

发表评论

标题

在此添加评论*

称呼*

邮箱地址(可选)

个人主页(可选)



Valid XHTML 1.0 Strict and CSS. Powered by Lifetype 沪ICP备06004858号
Template is designed by calfen, inherited from Template(dabu)designed by Tomex Ou