首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 网易面试遇到的两个linux编程的难题 [已结帖,结帖人:water_ding]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • water_ding
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-10-28 13:57:20 楼主
    请教:

    1、如果工程中只有.h文件改动,如何只编译需要编译的文件?makefile如何实现。

    2、linux下,程序开始运行,若缺少动态库,会提示缺少什么库的信息,这个是如何实现?

    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sailing0123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-28 14:14:591楼 得分:0
    1 在Makefile中写出与某程序相关联的文件(一般写cpp文件即可)
    2 提示link某库失败/某库不存在....


    比如编译net_server程序:
    net_server: net_server.cpp Common.cpp CLog.cpp
    g++  -o net_server \
        net_server.cpp Common.cpp CLog.cpp
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sailing0123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-28 14:17:522楼 得分:0
    makefile还有一种写法,
    就是把公共的类先编译成.o文件,
    其它程序链接自己所需的.o文件即可。

    楼主去看一下Makefile的语法吧
    虽然博大精深,
    但简单的还是很容易的!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhoujianhei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-28 15:39:413楼 得分:10
    1.
    obj: obj.cpp obj.h other.h
          g++ -c obj.cpp
    2.
    try{
    // load library
    }catch(...)
    {
    }
    没试验过。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xxgamexx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-28 15:43:254楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • water_ding
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-28 17:53:045楼 得分:0
    自己顶个,主要是第二个问题?当时完全没思路
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bshawk
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-10-28 19:04:336楼 得分:50
    1. 主要就是要确立.c 和.h文件的依赖关系! 如果没有这个依赖关系,修改.h之后,包含该.h文件的.c是不会被编译的(除非你make clean);
      简单地,参考3楼的方法;

    2. 缺少动态库的话,运行程序会提示如下信息: "当加载动态库libxxx.so的时候发生错误:原因是没有找到该动态库,不能打开";
     
      "error while loading shared libraries: libxxx.so: cannot open shared object file: No such file or directory"

      这个如何实现,主要是依赖于linux系统的加载器(ld.so, ld-linux.so*,详情可以man ld.so查看),加载器在加载一个程序运行的时候,
      会根据可执行程序里面的库信息,将所有的动态库先加载进入内存,如果找不到该动态库,那么就会打印上面的信息(这句信息是由ld.so,或者
      ld-linux.so*加载器打印出来的);

      good luck!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hngsc_0
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-28 19:25:497楼 得分:40
    1、如3楼所说,加.h的头文件依赖
    2、用动态库函数进行搜索如下路径
    LD_LIBRARY_PATH 指定的路径
    /etc/ld.so.conf 文件指定的路径
    /lib
    /usr/lib
    如果找不到,就报错

    GNU 动态库函数
    dlopen() //如果为空就表示出错,并打印出

    因为目前linux上的可执行文件都是ELF格式的文件,ELF文件由一个ELF文件信息头和很多节构成 ,找出里面的动态库节,里面有该可执行文件依赖的动态库文件,再用上方法去解析

    还可以再程序中用system()函数执行
    readelf -d 可执行文件 | grep .*.so文件查看其依赖的动态库
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jiazhen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-30 12:53:098楼 得分:0
    好帖子
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved