• Linux中C程序调试、makefile


    gcc基本语法格式:gcc [-选项] 源文件 [-选项] 目标文件,GCC编译C程序的过程:

    1. 预处理:gcc -E hello.c hello.i。-E指定执行预处理结束,下面类似。
    2. 编译:gcc -S hello.i -o hello.S。
    3. 汇编:gcc -c hello.S -o hello.o。
    4. 链接:gcc hello.o -o hello。链接阶段就需要涉及到函数库了,举例说明:要执行printf函数,我们都会#include <stdio.h>,但是预处理只能包含进stdio.h文件,也就是只有printf函数的声明,而函数实现在函数库libc.so.6中,虽然没有特别指定这个库,但是只要头文件中有声明,gcc会到系统默认搜索路径"/usr/lib"下查找并链接函数库,这样才能执行printf函数。

    函数库有静态库和动态库两种,简单来说,由.h和.c文件来生成函数库,编译后,就可以在其他.c文件中使用函数:

    静态库的创建和使用:

    1. 将.h和.c文件汇编成目标文件:gcc -c libhello.c -o libhello.o。
    2. 将目标文件归档,封装成库:ar -rc libhello.a libhello.o。
    3. 在编译过程中使用静态库:gcc usehello.c -o usehello_static libhello.a。然后就可以执行程序了。

    动态库的创建和使用:

    1. 汇编生成目标文件,和静态库一样:gcc -c libhello.c。
    2. 编译生成动态库:gcc libhello.o -shared -W1,-soname,libhello.so -o libhello.so。
    3. 编译程序和动态库:gcc usehello.c -o usehello_dy -lhello -L ./ 。
    4. 执行时,也需要指明动态库:LD_LIBRARY_PATH=$(pwd) ./usehello_dy 。

    当然还可以统一函数库版本的使用:

    gcc -c libhello.c
    gcc libhello.o -shared -W1,-soname,libhello.so -o libhello.so.1.0    //即生成库可能就会有多个版本
    ln -s libhello.so.1.0 libhello.so    //所以用一个软链接来更新版本,对外却统一显示
    gcc usehello.c -o usehello_dy -lhello -L ./
    LD_LIBRARY_PATH=$(pwd) ./usehello_dy

    如果在运行动态库时,不想指明库的路径,则有两种方法:

    1. 在/usr/lib或者/lib目录下,存放动态库或其链接。
    2. 在etc/ld.so.conf文件中,追加库或者链接所在的路径;然后退出保存,执行ldconfig命令使更改生效。

    工程管理器make:

    语法:系统默认自动变量:

    $<第一个依赖文件、$@目标文件。

    用户自定义变量:变量=值——引用$(变量)。

    将静态库用makefile完成,用make管理:

    usehello_static: usehello.c libhello.a
        gcc $< -o $@ libhello.a
    libhello.a: libhello.o
        ar -rc $@ $<
    libhello.o: libhello.c
        gcc -c $<
    clean: 
        rm usehello_static libhello.a libhello.o

    动态库:

    usehello_dy: usehello.c libhello.so
        gcc $< -o $@ libhello.so -L ./
    libhello.so: libhello.o
        gcc $< -shared -W1,-soname,libhello.so -o $@
    libhello.o: libhello.c
        gcc -c $<
    clean: 
        rm usehello_dy libhello.so libhello.o

    在makefile里面写lhello,它不认。

  • 相关阅读:
    用PHP编写Hadoop的MapReduce程序
    zookeeper原理
    实现输出h264直播流的rtmp服务器 flash直播服务器
    HTTP Live Streaming直播(iOS直播)技术分析与实现
    谷歌技术"三宝"之BigTable
    谷歌技术"三宝"之谷歌文件系统
    谷歌技术"三宝"之MapReduce
    Ceph分层存储分析
    Ubuntu系统监控cpu memery 磁盘Io次数 IO速率 网卡 运行时间等信息的采集
    java动态加载类和静态加载类笔记
  • 原文地址:https://www.cnblogs.com/quanxi/p/6254711.html
Copyright © 2020-2023  润新知