您的位置:首页 > 其它

Makefile学习笔记

2015-12-01 15:01 387 查看
仅预处理
# gcc -E main.c > main.txt

仅预处理,并且不删除注释
# gcc -C -E main.c > main.txt

仅预处理和编译,生成main.s汇编代码
# gcc -S main.c

仅预处理,编译和汇编,生成main.o文档
gcc -c main.c

定制输出目标文件
# gcc main.c -o hello
# gcc -S main.c -o main.asm

使用管道代替编译中的临时文件
# gcc -pipe -o hello main.c

开启ANSI C特性,与ANSI C不兼容的特性都会产生错误提示
禁用asm,inline,tyepof等关键字及一些预处理宏
# gcc -ansi main.c

# 使用ISO C89作为标准来编译程序, 等同于:-ansi
# gcc -std=c89 main.c

# 使用ISO C89和GNU的一些扩展作为标准来编译程序
# gcc -std=gnu89 main.c

# 使用ISO C99作为标准来编译程序
# gcc -std=c99 main.c

# 使用ISO C99和GNU的一些扩展作为标准来编译程序
# gcc -std=gnu99 main.c

# 使用 C++98作为标准来编译程序
# g++ -std=c++98 main.cpp

相当于#include <foo.h>
# gcc main.c -include ./foo.h

相当于#define NDEBUG
# gcc -DNDEBUG main.c

相当于#define PI=3.14
# gcc -DPI=3.14 main.c

相当于#undef PI
# gcc -UPI main.c

先在DIR指定目录查找,然后在当前目录查找,最后在缺省的头文件目录查找
# gcc -IDIR main.c

取消前一个参数的功能 -l-
# gcc -IDIR -l- main.c

不在标准头文件目录查找
# gcc -IDIR -nostdinc main.c

指定库路径
# gcc -LDIR main.c

指定依赖库
# gcc -lpthread main.c

生成文件关联信息,分析文件依赖关系
# gcc -M main.c
# gcc -MM main.c (忽略#include <file>所依赖的关系)

优化选项
-O0 无优化
-O1 缺省值,简写:-O
-O2
-O3 最高级优化
# gcc -O3 main.c

产生调试信息
# gcc -g main.c

尽可能生成符合gdb的调试信息
# gcc -ggdb main.c

使用静态链接方式生成可执行文件
# gcc -static main.c

尽量使用动态库(当静态库与动态库同名时,GCC将优先使用动态库)
# gcc -shared main.c
# gcc -shared -fPIC main.c (生成位置无关目标文件)

开启大部分告警信息
# gcc -Wall main.c

使告警信息变成错误处理,有告警时停止编译
# gcc -Werror main.c

当一个局部变量遮住了另一个局部或全局变量,给出告警
# gcc -Wshadow main.c

对合法但值得怀疑的表达式发出警告
# gcc -Wextra main.c

当编译时不符合ANSI/ISO C标准的地方列出警告
# gcc -pedantic main.c
# gcc -Wall -ansi -pedantic main.c

生成32位机器上的代码
# gcc -m32 main.c

生成64位机器上的代码,不能运行在32位环境,适用于x86_64和x64环境
# gcc -m64 main.c

单步生成静态库
# gcc -c hello.c -o hello.o
# ar rcs libHello.a hello.o
# gcc main.c -o main -static ./libHello.a

单步生成动态库
# gcc -shared -fPIC hello.c -o libHello.so
# gcc main.c ./libHello.so -o main

类似执行strip,去除可执行文件中的符号表和重定位信息
# gcc -s main.c

运行时先查找指定库路径,然后再查找标准库路径
# gcc -Wl, -rpath=DIR1:DIR2 -I. -L. -lpthread main.c
# gcc -Wl, -rpath,DIR1:DIR2 -I. -L. -lpthread main.c

管理员权限下,更新标准库搜索路径
# cd XXX_HOME/lib
# pwd >> /etc/ld.so.conf
# /sbin/ldconfig

普通用户权限下,临时更新标准库搜索路径
$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/XXX_HOME/lib

$@ - 目标
$< - 第一个依赖文件
$^ - 所有依赖文件

# Copyright (c) 2015 by Zhang Taian. ALL RIGHTS RESERVED.
# Author: Zhang Taian
# E-Mail: 1523905949@qq.com
# Github: https://github.com/zhangtaian # Create: 2015-11-21

TARGET := XXX
NDEBUG := 1
CPP    := 0

BINARY := $(TARGET).bin
SHARED := lib$(TARGET).so
STATIC := lib$(TARGET).a

ifeq ($(NDEBUG), 1)
CFLAGS += -DNDEBUG
LDFLAGS += -O3
else
CFLAGS += -DDEBUG
CFLAGS += -D_DEBUG
CFLAGS += -g
LDFLAGS += -O0
endif

CFLAGS += -D_REENTRANT
CFLAGS += -D_FILE_OFFSET_BITS=64
CFLAGS += -pipe
CFLAGS += -W -Wall -Werror -Wshadow -Wextra
CFLAGS += -m64 -fPIC
#CFLAGS += -std=c++11
#CFLAGS += -std=c89 -pedantic
CFLAGS += -I.
CFLAGS += -I../3rd/XXX/include

#LDFLAGS += -static
LDFLAGS += -lpthread
LDFLAGS += -L.
LDFLAGS += -Wl,-rpath=.
#LDFLAGS += -L../3rd/XXX/lib -lXXX

SRC_C   := $(wildcard *.c)
OBJ_C   := $(patsubst %.c,%.o,$(SRC_C))
#OBJ_C  := $(SRC:%.c=%.o)
SRC_CPP := $(wildcard *.cpp)
OBJ_CPP := $(patsubst %.cpp,%.o,$(SRC_CPP))

ifeq ($(CPP), 1)
CC := g++
OBJ := $(OBJ_CPP)
else
OBJ := $(OBJ_C)
endif

%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@

%.o: %.cpp
$(CXX) $(CFLAGS) -c $< -o $@

.PHONY: all
all: $(BINARY)
#all: $(BINARY) $(SHARED) $(STATIC)

.PHONY: $(BINARY)
$(BINARY): $(OBJ)
$(CC) $(LDFLAGS) $^ -o $@

.PHONY: $(SHARED)
$(SHARED): $(OBJ)
$(CC) -shared -fPIC $(LDFLAGS) $^ -o $@

.PHONY: $(STATIC)
$(STATIC): $(OBJ)
$(AR) -rcs $(LDFLAGS) $^ -o $@

.PHONY: clean
clean:
-$(RM) $(OBJ)

.PHONY: distclean
distclean: clean
-$(RM) $(BINARY)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: