#-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

makefile 和 编译条件 的简略总结的更多相关文章

  1. [ActionScript&Flex] FlashBuilder编译条件之如何屏蔽调试代码

    下面讲一下在FlashBuilder中如何添加编译器参数使我们在发布的时候不编译调试代码: 首先设置编译参数 编译参数设置好后,代码我们可以这样写: public class ConditionalC ...

  2. 工程文件csproj使用编译条件指定属性

    csproj工程文件中有很多xml格式的属性,比如PropertyGroup.ItemGroup,某些属性操作默认是全部的或者是当前编译条件的而已,当我们想指定某些属性只在某个编译条件下发生时就可以通 ...

  3. [Delphi]编译条件

    当软件在多个DELPHI版本下编译时,需要处理各版本的不同情况,使用编译条件技术实现. 万一博客,编译指令基础使用介绍:http://www.cnblogs.com/del/category/1686 ...

  4. GNU Makefile中的条件控制结构

    在常见的编程语言中,使用条件控制结构诸如if ... else if ... else...是很寻常的事情,那么在GNU Makefile中如何使用呢? ifeq ifneq 例如:foo.sh #! ...

  5. Linux makefile教程之条件判断六[转]

    使用条件判断 —————— 使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支.条件表达式可以是比较变量的值,或是比较变量和常量的值. 一.示例 下面的例子,判断$(CC)变量是否“g ...

  6. Makefile基础---编译

    首先写一个自己的库: #include "../MyAPI.h" #include <cstdlib> #include <ctime> int getRa ...

  7. 生成makefile文件编译源文件

    1.利用CodeBlock的cbp文件生成makefile文件 reverse@ubuntu:~/Desktop/CreateMakeFile$ ls cbp2make.linux-x86 freeg ...

  8. makefile在编译的过程中出现“except class name”

    今天写了部分代码,在添加到项目中后就那些编译,出现问题如下: logistic_regression_layer.h::: error: expected class name public Laye ...

  9. 详解在Linux下实现(彩色)进度条程序,并通过makefile进行编译.

    彩色进度条的实现与makefile编译: 创建一个process文件,在里面编写实现进度条的代码    1.在编写代码的时候我们首先要区分两个转义字符:\n \r \n:表示换行,换到下一行,并位于起 ...

随机推荐

  1. angular-ui-router速学

    Demo1 初始化 <html ng-app="app"> <head> <style>.active { color: red; font-w ...

  2. vue基础项目安装教程

    安装node.js 从node.js官网下载并安装node,安装过程很简单,一路“下一步”就可以了. 安装完成之后,打开命令行工具,输入 node -v,如下图,如果出现相应的版本号,则说明安装成功. ...

  3. 阿里云配置ssl证书

    一.申请证书和下载证书(阿里云申请) 二.在nginx服务器上配置ssl证书 1.检查服务器是否安装openssl 2.在nginx conf 文件夹创建 cret 文件,放置证书 [root@web ...

  4. 激活IntelliJ IDEA到2100年

    1.下载破解文件(破解版本2018.2,其他版本未尝试) http://idea.lanyus.com/jar/JetbrainsIdesCrack-4.2-release-sha1-3323d5d0 ...

  5. 504. Base 7

    Given an integer, return its base 7 string representation. Example 1: Input: 100 Output: "202&q ...

  6. 腾讯 深圳 25928-PHP开发工程师(深圳)

    工作地点:深圳 职位类别:技术类 招聘人数:1人 工作职责: 负责游戏研运体系流程工具及相关产品的开发.维护: 参与支撑系统的需求分析.设计.编码: 承担外包开发成员技术导师,解决技术难点,把控开发质 ...

  7. “北航Clubs” Beta版本开发目标

    Beta版本开发目标 总体设想:修复Alpha版本中的若干bug,并在Alpha版本成果之上进行进一步开发,实现社员管理.评论.站内信等功能. 1.对Alpha版本功能的更新与加强 后端实现从SQLi ...

  8. 求二维数组联通子数组和的最大值 (联通涂色) beta!

    算法十分臃肿,效率捉鸡,不知用了多少循环,还有bug...任重道远,编程之美. 思想:按行遍历,找出每行的最大子数组.若行间都联通,行最大子数组相加后,再加上独立的正数.若行间不连通,找出较大子路径, ...

  9. 03-java学习-基本数据类型-运算符-键盘接收用户输入

    java的八大基本数据类型: 类型转换的基本原则: java整数的默认类型是int,小数的默认类型是double 运算符: 算术运算符.连接.赋值.关系.逻辑.三目运算符等…… 键盘接收用户输入: j ...

  10. (第三周)c#程序理解

    阅读下面程序,请回答如下问题: 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间 ...