gcc和g++使用

gcc/g++ 和 makefile 的基本用法

gcc/g++流程

预处理 -> 编译 -> 汇编 -> 链接

常见选项

目录选项

-L[dir]  指定搜索目录

默认会在/lib/usr/lib/usr/local/lib三个目录进行搜索

👉 动态添加方法 pkg-config [pkg_name] —libs

-l[libname] 指定程序要链接的库,-l参数紧接着就是库名

例如: 库名是m, 库文件名 libm.so  链接 -lm

头文件设置

-I 指定头文件目录

/usr/include目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在 /usr/icnclude 里我们就要用-I参数指定了,比如头文件放在 /myinclude目录里,那编译命令行就要加上 -I /myinclude

—include [lib] 用来包含头文件

一般情况下包含头文件都在源码里用#include xxxxxx实现, --include 参数很少用。

连接器选项

-share 共享库:尽量使用动态库

-static   静态库: 禁止使用动态库

警告选项

-w 禁止所有警告信息

-Wall 开启大部分警告提示

-Werror 视警告为错误

指定优化级别

包含-O1/-O2-O3等级别,推荐使用-O3 进行优化

生成位置无关目标码

-fpic 适用于共享库

-fPIC  适用于动态链接库

语言选项

-ansi # 支持符合ANSI标准的C程序

-std=c99 # c99标准

-std=C++11 # 支持 c++11 标准 <-

常见环境变量

PKG_CONFIG_PATH:用来指定pkg-config用到的pc文件的路径,默认是/usr/lib/pkgconfig,pc文件是文本文件,扩展名是.pc,里面定义开发包的安装路径,Libs参数和Cflags参数等等。

CC:用来指定c编译器。

CXX:用来指定cxx编译器。

LIBS:跟上面的—libs作用差不多。

CFLAGS:跟上面的—cflags作用差不多。

CC,CXX,LIBS,CFLAGS 手动编译时一般用不上,在做configure时有时用到,一般情况下不用管。

环境变量设定方法:export ENV_NAME=xxx

makefile 基本格式

# 指定编译器

# 设置编译选项
# 库 & 头文件

# 变量设置

# 语句:
# 编译目标:依赖文件
#     运行脚本

# 清理脚本

makefile 模板

CC = g++ 

CFLAGS += -g -O3 -Wall
INC += -I. `pkg-config --cflags opencv` 
LIBS += `pkg-config --libs opencv`  

TARGET = main.bin
OBJS += main.o \
        config.o 

all:$(TARGET)
$(TARGET):$(OBJS)
    $(CC) $(INC) $(CFLAGS) $(OBJS) -o $(TARGET) $(LIBS)
$(OBJS):%.o:%.cpp
    $(CC) $(INC) $(CFLAGS) -c $< -o $@

.PHONY:clean
clean: 
    rm -r *.o $(TARGET)

参考:

<跟我一起写 Makefile> 陈皓


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!