zoukankan      html  css  js  c++  java
  • Makefile 编译与链接选项及CFLAGS与LDFLAGS

    本文转载自:https://blog.csdn.net/zhaoyun_zzz/article/details/82466031

    近看了makefile的手册之后,发现还是不知道怎么写makefile,而且就连看也看的是云里雾里,就我现在工作当中看到的一些makefile文件,只能看个大概的意思,一旦涉及到文件添加、静态库、动态库等增加、删除;文件搜索路径等的修改就没法下手了,因此下定决心必须对我比较关注的地方进行深度学习,知其然还要知其所以然,知道怎么从无到有写出来,而且别人的makefile还要知道怎么根据需求的变化进行修改。但这不是一步就能能达到的,咱还是先全面理解别人写的makefile开始吧。
    关于makefile的依赖规则以及目标生成的步骤,这篇先不介绍,这里主要关注我在看makefile时遇到的一堆CFLAGS与LDFLAGS定义进行说明。
    费了牛劲,才查到GNUmake中文手册中关于CFLAGS与LDFLAGS的说明,他们都是是隐含规则的变量,且是一种命令参数变量;然后又到GCC手册中查找有哪些编译选项。
    makefile内嵌隐含规则的命令中,所使用的变量都是预定义的变量。我们将这些变量称为“隐含变量”。这些变量允许对它进行修改:在Makefile中、通过命令行参数或者设置系统环境变量的方式来对它进行重定义。无论是用那种方式,只要make在运行时它的定义有效,make的隐含规则都会使用这些变量。

    GCC编译选项CFLAGS参数

    选项说明
    -c 用于把源码文件编译成 .o 对象文件,不进行链接过程
    -o 用于连接生成可执行文件,在其后可以指定输出文件的名称
    -g 用于在生成的目标可执行文件中,添加调试信息,可以使用GDB进行调试
    -Idir 用于把新目录添加到include路径上,可以使用相对和绝对路径,“-I.”、“-I./include”、“-I/opt/include”
    -Wall 生成常见的所有告警信息,且停止编译,具体是哪些告警信息,请参见GCC手册,一般用这个足矣!
    -w 关闭所有告警信息
    -O 表示编译优化选项,其后可跟优化等级0123,默认是0,不优化
    -fPIC 用于生成位置无关的代码
    -v (在标准错误)显示执行编译阶段的命令,同时显示编译器驱动程序,预处理器,编译器的版本号

     

    GCC链接选项LDFLAGS参数

    选项说明
    -llibrary 链接时在标准搜索目录中寻找库文件,搜索名为liblibrary.a 或 liblibrary.so
    -Ldir 用于把新目录添加到库搜索路径上,可以使用相对和绝对路径,“-L.”、“-L./include”、“-L/opt/include”
    -Wl,option 把选项 option 传递给连接器,如果 option 中含有逗号,就在逗号处分割成多个选项
    -static 使用静态库链接生成目标文件,避免使用共享库,生成目标文件会比使用动态链接库大

     

     

     

     

     

     

    实例

    CFLAGS = -g -Wall -I./include -I./include/tinyalsa -Wl,--whole-archive -lpthread -Wl,--no-whole-archive -lc
    LDFLAGS = -L./lib
    ALL:
        $(CC) $(CFLAGS) $(LDFLAGS) main.c gfifo.c queue.c usbmonitor.c socket_rcv_360_server.c ./lib/srs_librtmp.a ./lib/libcrypto.a ./lib/libssl.a ./lib/libtinyalsa.a -o media_record -static -ldl -lstdc++ -lm -lpthread
    clean:
        rm media_record *.raw *.mp4 *.wav -rf
    
    CFLAGS = -g -Wall -I./include -I./include/tinyalsa -Wl,--whole-archive -lpthread -Wl,--no-whole-archive -lc
    -g:生成调试信息
    -Wall:输出全部的告警信息
    -I./include:添加头文件搜索目录./include
    -I./include/tinyalsa:添加头文件搜索目录./include/tinyalsa
    -Wl,--whole-archive -lpthread:将libpthread.so及以后的库中的所有符号都链接进可执行目标文件
    -Wl,--no-whole-archive:关闭之前的-Wl,--whole-archive -lpthread 选项
    LDFLAGS = -L./lib,将makefile当前目录下的、lib文件夹添加到库文件搜索目录
    
    $(CC):makefile隐含变量,默认选择gcc编译器
    $(CFLAGS):引用之前定义的CFLAGS变量,即编译选项参数
    $(LDFLAGS):引用之前定义的LDFLAGS变量,即链接参数
    
    $(CC) $(CFLAGS) $(LDFLAGS) main.c gfifo.c queue.c usbmonitor.c socket_rcv_360_server.c ./lib/srs_librtmp.a ./lib/libcrypto.a ./lib/libssl.a ./lib/libtinyalsa.a -o media_record -static -ldl -lstdc++ -lm -lpthread
    使用定的编译器、编译选项参数、链接选项参数,编译.c文件,并使用静态方式链接制定的库文件,以及编译器目录下的libdl.a、libstdc++.a、libm.a、libpthread.a库文件生成 media_record 可执行目标文件。

     

  • 相关阅读:
    hdu 4027 Can you answer these queries?
    hdu 4041 Eliminate Witches!
    hdu 4036 Rolling Hongshu
    pku 2828 Buy Tickets
    hdu 4016 Magic Bitwise And Operation
    pku2886 Who Gets the Most Candies?(线段树+反素数打表)
    hdu 4039 The Social Network
    hdu 4023 Game
    苹果官方指南:Cocoa框架(2)(非原创)
    cocos2d 中 CCNode and CCAction
  • 原文地址:https://www.cnblogs.com/thoughtInShare/p/14089222.html
Copyright © 2011-2022 走看看