zoukankan      html  css  js  c++  java
  • makefile 和 编译条件 的简略总结

    #-g 
    gdb可看代码
    
    #-fPIC 
    -fPIC 的使用,会生成 PIC 代码,.so 要求为 PIC,以达到动态链接的目的,否则,无法实现动态链接。
    -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
    https://blog.csdn.net/derkampf/article/details/69660050
    
    #-O2
    -O1 提供基础级别的优化
    -O2 提供更加高级的代码优化,会占用更长的编译时间
    -O3 提供最高级的代码优化
    https://blog.csdn.net/xinianbuxiu/article/details/51844994
    
    #-ldl
    ldl选项,表示生成的对象模块需要使用共享库
    https://blog.csdn.net/hlzs_01/article/details/39337557
    
    #-s
    这个参数会把符号表从最终的可执行文件中删除。没有符号表,你就不能用gdb调试了
    https://zhidao.baidu.com/question/145908113.html
    #-shared 生成共享目标文件。通常用在建立共享库时。 #ar ar命令是Linux的一个备份压缩命令,可以创建、修改备存文件(archive),或从备存文件中抽取成员文件。备存文件以一定的结构打包一个至多个其它文件(即成员文件),且成员文件的内容、模式、时间戳等信息将被保存在备存文件中。 常见的应用是,使用ar命令将多个目标文件(*.o)打包为静态链接库文件(*.a)。 参数 -r 将文件插入备存文件中 -s 等价于运行ranlib。 (ranlib更新库的有效符号表) c 建立备存文件。 v 程序执行时显示详细的信息。 ####################makefile https://www.cnblogs.com/wang_yb/p/3990952.html target ... : prerequisites ... command ... ... target - 目标文件, 可以是 Object File, 也可以是可执行文件 makefile中的每个标的(target)都代表了一个文件。 如果只运行make命令,那么默认执行第一个标的。 执行一个标的时,会做两件事情:    查看与这个标的同名的文件是否存在,如果不存在,那么就运行这个标的下面的命令。    如果与这个标的同名的文件已经存在,那么就检查与这个标的同名的文件是否需要更新(即标的文件的修改时间是否早于依赖文件的修改时间),如果需要更新,那么就运行这个标的下面的命令。 prerequisites - 生成 target 所需要的文件或者目标(目标存在则先去执行目标处代码) command - make需要执行的命令 (任意的shell命令), Makefile中的命令必须以 [tab] 开头 #vpath vpath pattern path : 符合pattern的文件在path目录搜索。 vpath pattern : 清除pattern指定的文件搜索路径 vpath : 清除所有文件搜索路径。 VPATH:官方解释为一般搜索,大写的VPATH是make中一种特殊变量,这个变量指定了make中的依赖文件的路径,用空格或者冒号将多个路径隔开。 VPATH = dir1:dir2:dir3 或 VPATH = dir1 dir2 dir3 vpath:官方解释为选择性搜索,小写的vpath,这是make中的一个关键字,通俗来讲就是在指定路径中寻找指定类型的文件,vpath的用法要比VPATH更加灵活。用空格或者冒号将多个路径隔开,这个和VPATH一样。 vpath %.c dir1 dir2 dir3 #dir dir $(CPP_SOURCES) 获取各个文件路径,以空格隔开返回 #前缀 不用前缀 :: 输出执行的命令以及命令执行的结果, 出错的话停止执行 前缀 @ :: 只输出命令执行的结果, 出错的话停止执行 前缀 - :: 命令执行有错的话, 忽略错误, 继续执行 #伪目标 PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字。有两种理由需要使用PHONY 目标:避免和同名文件冲突,改善性能。 .PHONY: clean clean: -rm -rf $(OBJ_PATH) 这里clean目标没有依赖文件 #引用其他的 Makefile 语法: include <filename> (filename 可以包含通配符和路径) # 自动变量 Makefile 中很多时候通过自动变量来简化书写, 各个自动变量的含义如下: $@ 目标集合 $< 第一个依赖目标. 如果依赖目标是多个, 逐个表示依赖目标 $^ 所有依赖目标的集合, 会去除重复的依赖目标 #notdir 1、wildcard : 扩展通配符 2、notdir : 去除路径 3、patsubst :替换通配符 .c变.o 在test下,建立a.c和b.c2个文件,在sub目录下,建立sa.c和sb.c2 个文件 src=$(wildcard *.c ./sub/*.c) @echo $(src) #输出 a.c b.c ./sub/sa.c ./sub/sb.c dir=$(notdir $(src)) @echo $(dir) # a.c b.c sa.c sb.c obj=$(patsubst %.c,%.o,$(dir) ) @echo $(obj) # a.o b.o sa.o sb.o 或者可以使用 obj=$(dir:%.c=%.o) $(var:a=b) 或 ${var:a=b} 它的含义是把变量var中的每一个值结尾用b替换掉a https://blog.csdn.net/srw11/article/details/7516712

  • 相关阅读:
    《linux内核设计与实现》读书笔记第十八章
    20135337朱荟潼 Linux第八周学习总结——进程的切换和系统的一般执行过程
    2013337朱荟潼 Linux第四章读书笔记——进程调度
    2013337朱荟潼 Linux&深入理解计算机系统第七章读书笔记——链接
    20135337朱荟潼 Linux第七周学习总结——可执行程序的装载
    2013337朱荟潼 Linux第三章读书笔记——进程管理
    20135337朱荟潼 Linux第六周学习总结——进程的描述和进程的创建
    2013337朱荟潼 Linux第十八章读书笔记——调试
    20135337朱荟潼 Linux第五周学习总结——扒开系统调用的三层皮(下)
    2013337朱荟潼 Linux第五章读书笔记——系统调用
  • 原文地址:https://www.cnblogs.com/hei-hei-hei/p/10180185.html
Copyright © 2011-2022 走看看