zoukankan      html  css  js  c++  java
  • C笔记-makefile

    参考资料1跟我一起写makefile  http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:MakeFile%E4%BB%8B%E7%BB%8D

    参考资料1:多目录时makefile编写方法    http://blog.csdn.net/guoxiaojie_415/article/details/52206139

    参考资料2:makefile中 -I 和 VPATH区别  http://blog.csdn.net/bingo_boy/article/details/48181265

    参考资料3:makefile vpath VPATH的使用 https://www.cnblogs.com/pengdonglin137/p/5087304.html

    参考资料4:makefile使用总结  https://www.cnblogs.com/wang_yb/p/3990952.html

    关于vpath-I参数:

    vpath只对Makefile中的依赖查找有效:
    比如: main.o: test.h 这里的test.h在vpath指定的路径中,make根据vpath去寻找依赖规则
    然后-I 指明了gcc 编译时test.h 查找路径


    添加头文件 -I(常用)

    • 例如在/home/work/include/目录下有编译foo.c所需头文件def.h,为了让GCC能找到它们,就需要使用-I选项:
    • $ gcc foo.c def.h -I/home/work/include -o foo


    添加库文件:-L (常用)

    • 例如在/home/work/lib/目录下有链接所需库文件libdef.so,为了让GCC能找到它们,就需要使用-L选项:
    • $ gcc foo.c –L/home/work/lib –ldef.so –o foo
    • 说明:-l选项指示GCC去连接库文件libdef.so。Linux下的库文件命名有一个约定,即库文件以lib三个字母开头,因为所有的库文件都遵循这个约定,故在用-l选项指定链接的库文件名时可以省去lib三个字母。
    • Linux下的库文件分为动态链接库(.so文件)和静态链接库(.a文件)。GCC默认为动态库优先,若想在动态库和静态库同时存在的时候链接静态库需要指明为-static选项。比如上例中如还有一个libdef.a而你想链接libdef.a时候命令如下:
    • $ gcc foo.c –L/home/work/lib –static –ldef.a –o foo


    生成动态库

    gcc hello.c -I../include -fPIC -shared -o libhello.so
    这一步将在当前目录生成动态库文件libhello.so
    -shared shared object,即动态链接库。
    -fPIC 意为位置独立代码,指示编译程序生成的代码要适合共享库的内容这样的代码能够根据载入内存的位置计算内部地址。
    可以先-c生成.o文件,然后生成.so文件。


    生成静态库

    ar -r libhello.a hello1.o hello2.o
    将hello1.o和hello2.o组合为libhello.a这个静态链接库

    (1)Makefile中的 符号 $@, $^, $< 的意思:
      $@  表示目标文件
      $^  表示所有的依赖文件
      $<  表示第一个依赖文件
      $?  表示比目标还要新的依赖文件列表

    (2)wildcard、notdir、patsubst的意思:

      wildcard : 扩展通配符
      notdir : 去除路径
      patsubst :替换通配符

    #VPATH = /data/webroot/seadonli/testc/readline/:/data/webroot/seadonli/testc/lib
    
    CUR_DIR = /data/webroot/seadonli/testc/
    READ_DIR = ${CUR_DIR}/readline
    LIB_DIR = ${CUR_DIR}/lib
    
    INC_DIR=-I${READ_DIR} 
            -I${LIB_DIR}
    
    SRC = ${wildcard ${READ_DIR}/*.c} 
          ${wildcard ${LIB_DIR}/*.c}
    
    OBJ = ${patsubst %.c, %.o, ${SRC}}
    
    cc = gcc
    
    #is_seqnum_sv :  is_seqnum_sv.o error_functions.o get_num.o  read_line.o
    is_seqnum_sv : ${OBJ}
      cc is_seqnum_sv.c ${OBJ} -o is_seqnum_sv
    
    error_functions.o: ${LIB_DIR}/error_functions.c ${LIB_DIR}/error_functions.h
      cc -c error_functions.c
    
    get_num.o: ${LIB_DIR}/get_num.c ${LIB_DIR}/get_num.h
      cc -c get_num.c 
    
    read_line.o: ${READ_DIR}/read_line.c ${READ_DIR}read_line.h
      cc -c read_line.c 
    
    is_seqnum_sv.o : is_seqnum_sv.c is_seqnum.h
      cc -c is_seqnum_sv.c
    clean :
    rm is_seqnum_sv

    Makefile中一些GNU约定俗成的伪目标

    如果有过在Linux上, 从源码安装软件的经历的话, 就会对 make clean, make install 比较熟悉.

    像 clean, install 这些伪目标, 广为人知, 不用解释就大家知道是什么意思了.

    下面列举一些常用的伪目标, 如果在自己项目的Makefile合理使用这些伪目标的话, 可以让我们自己的Makefile看起来更专业, 呵呵 :)

    伪目标

    含义

    all 所有目标的目标,其功能一般是编译所有的目标
    clean 删除所有被make创建的文件
    install 安装已编译好的程序,其实就是把目标可执行文件拷贝到指定的目录中去
    print 列出改变过的源文件
    tar 把源程序打包备份. 也就是一个tar文件
    dist 创建一个压缩文件, 一般是把tar文件压成Z文件. 或是gz文件
    TAGS 更新所有的目标, 以备完整地重编译使用
    check 或 test 一般用来测试makefile的流程

    Makefile missing separator. Stop.如何解决
    Makefile:1: *** missing separator. Stop.
    [解决办法]
    这个makefile里不要乱用TAB,只有命令所在的行才能且只能以TAB开头!
    其他的如,make变量的定义、赋值,make内定函数如$(error "strings")都不能以TAB开头,不然make会将其作为命令来处理

    make 全部的cpp文件 
    要把一个 hello.cpp 文件编译成 hello

    all : hello another
    
    hello : hello.cpp
    g++ -o $@ $<
    
    another : another.cpp
    g++ -o $@ $<

    直接 make 或 make all 的话会执行 hello.cpp 和 another.cpp 的编译命令
    后面不加参数的话,会把第一个目标作为默认的
    make hello 的话只编译 hello.cpp
    make another 的话只编译 another.cpp

  • 相关阅读:
    ZOJ 2588 Burning Bridges
    POJ 1966 ZOJ 2182 Cable TV Network
    HDU 5348 MZL's endless loop
    HDU 5352 MZL's City
    Tarjan算法求解无向连通图的割点、割边、点双连通分量和边双连通分量的模板
    ZOJ 1119 SPF
    HDU 3452 Bonsai
    HDU 1520 Anniversary party
    POJ 2239 Selecting Courses
    POJ 1144 Network
  • 原文地址:https://www.cnblogs.com/gnivor/p/8310479.html
Copyright © 2011-2022 走看看