当前位置:网站首页>gcc使用、Makefile总结
gcc使用、Makefile总结
2022-07-01 03:07:00 【暮尘依旧】
文章目录
前言
最近在弄一个比赛,要使用到C编程,自己之前一般都是用集成化的IDE进行C的编程,对于使用gcc,g++直接编译代码属实不了解,了解了一下相关使用,并学习了一些基础的makefile语法知识,写下工作总结
一、gcc使用
https://gcc.gnu.org/onlinedocs/gcc-12.1.0/gcc/Overall-Options.html#Overall-Options
官方文档
查看gcc版本
gcc --version
无任何编译选项
编译.c文件,并链接成可执行文件。默认输出名字a.out,输出文件到当前目录下。
gcc main.c
选项 -o
指定输出的文件名字
gcc main.c -o main.o
选项 -E
预处理阶段后停止;不运行编译器。输出采用预处理源代码的形式,发送到标准输出。即会生成.i结尾的文件
预处理功能主要包括宏定义, 文件包含, 条件编译, 去注释等。
预处理指令是以 # 号开头的代码行。
file.c:必须预处理的 C 源代码。
file.i:不应预处理的 C 源代码。
file.ii:不应预处理的 C++ 源代码。
gcc -E main.c -o main.i
选项 -S
编译成汇编语言但不进行链接
gcc -S main.c -o main.s
gcc -S main.i -o main.s
选项 -c
编译文件到目标文件,但不进行链接
gcc -c main.c -o main.o
链接生成可执行文件
将所有.o文件进行链接,生成可执行文件,默认动态链接
gcc main.o test.o -c main # 将目标文件进行链接
gcc main.c test.c -o main #一步生成可执行文件
-static 此选项对生成的文件采用静态链接
gcc main.c test.c -o main_Static --static
链接分为两种:
动态链接:GCC编译时的默认选项。动态是指在应用程序运行时才去加载外部的代码库,不同的程序可以共用代码库。 所以动态链接生成的程序比较小,占用较少的内存。
静态链接:链接时使用选项 “–static”,它在编译阶段就会把所有用到的库打包到自己的可执行程序中。 所以静态链接的优点是具有较好的兼容性,不依赖外部环境,但是生成的程序比较大。
代码优化 -O
-O0 -O1 -O2 -O3 编译器的优化选项的 4 个级别, -O0 表示没有优化 ,-O3 优化级别最高。-O3的优化会比较暴力,但优化效果很好
gcc main.c -O1 -o main
编译所需文件目录 -I
我们在写代码的时候,为了整个工程的美观性和便于整理代码,一般会将.c和.h分开,-I 目录名称
可以让gcc找到需要链接的文件目录
gcc main.c -I ./inc -o main #包含inc中的所有文件
其他
-g
生成调试信息。 GNU 调试器可利用该信息-lpthread
文件中若包含多线程pkg-config opencv --libs
包含opencv的C++库
二、Makefile文件
如果我们每次都输入一长串编译的指令的时候,会非常的麻烦,而makefile可以简化我们的需要。
makefile一个最关键的语法规则如下,代表了你需要生成什么目标,其依赖部分是什么,后续执行操作就放在命令中。
目标...: 依赖...
命令1
命令2
...
一些特殊变量
[email protected]:目标的名字
$^:构造所需文件列表所有所有文件的名字
$<:构造所需文件列表的第一个文件的名字
$?:构造所需文件列表中更新过的文件
具体知识可以参考下面的博客
https://blog.csdn.net/afei__/article/details/82696682
https://blog.csdn.net/BobYuan888/article/details/88640923
先摆一个最近自己用的Makefile文件,以后自己也可以方便用。这里面包含了c++和c语言的混合编译的部分
Makefile例子
BIN_DIR = bin
SRC_DIR = src
INC_DIR = inc
OBJ_DIR = obj
CC = gcc
C++ = g++
LD = gcc #链接所需用的编译器
INC = -I$(INC_DIR)
CFLAGS += $(INC)
OPT = -O1
LDFLAGS = -lm
# C文件
OBJ_FILES_C = $(OBJ_DIR)/main.o \
$(OBJ_DIR)/jpeg.o \
$(OBJ_DIR)/show.o \
$(OBJ_DIR)/huff.o
# 所有文件
OBJ_FILES = $(OBJ_FILES_C)
#总链接可执行文件gcode的位置
TARGET = $(BIN_DIR)/gcode
# all代表最终生成文件
all: $(TARGET)
# c文件编译
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) $(OPT) -c $< -o [email protected]
# cpp文件编译
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
$(C++) $(CFLAGS) $(OPT) -c $< -o [email protected]
# 如果要链接别的库的话,必须要在最后所有.o文件链接为一个文件的时候链接opencv库
# 如果在生成.o文件的时候链接会导致最终找不到该库
$(TARGET) : $(OBJ_FILES_C)
$(C++) $(LDFLAGS) $(OBJ_FILES_C) $(OPT) -o [email protected] -lpthread
# -lpthread代表代码中包含多线程执行
# $(C++) $(LDFLAGS) $(OBJ_FILES) -o [email protected] `pkg-config opencv --libs` #若包含opencv库需要链接
@echo "> build success <"
#make clean指令
clean:
rm -f $(TARGET) $(OBJ_FILES)
三、C和C++混合编程
放篇博客
https://blog.csdn.net/this_is_me_anyway/article/details/79397018
参考
gcc部分
https://zhuanlan.zhihu.com/p/404682058
https://gcc.gnu.org/onlinedocs/gcc-12.1.0/gcc/Overall-Options.html#Overall-Options
Makefile部分
https://blog.csdn.net/BobYuan888/article/details/88640923
https://blog.csdn.net/afei__/article/details/82696682
边栏推荐
- xxl-job使用指南
- VMware vSphere 6.7虚拟化云管理之12、VCSA6.7更新vCenter Server许可
- [us match preparation] complete introduction to word editing formula
- Subnet division and subnet summary
- Mouse over effect IV
- IEDA 右键源码文件菜单简介
- JS to find duplicate elements in two arrays
- 【Qt】添加第三方库的知识补充
- 【读书笔记】《文案变现》——写出有效文案的四个黄金步骤
- Druid monitoring statistics source
猜你喜欢
Lavaweb [first understanding the solution of subsequent problems]
Chapitre 03 Bar _ Gestion des utilisateurs et des droits
So easy deploy program to server
[applet project development -- Jingdong Mall] classified navigation area of uni app
Servlet [first introduction]
Network address translation (NAT) technology
Let's just say I can use thousands of expression packs
# 使用 KubeKey 搭建 Kubernetes/KubeSphere 环境的'心路(累)历程'
How the network is connected: Chapter 2 (Part 2) packet receiving and sending operations between IP and Ethernet
Redis 教程
随机推荐
Cloud native annual technology inventory is released! Ride the wind and waves at the right time
servlet【初识】
Voici le programme de formation des talents de SHARE Creators!
Huawei operator level router configuration example | BGP VPLS and LDP VPLS interworking example
如果在小券商办理网上开户安全吗?我的资金会不会不安全?
Completely solve the lost connection to MySQL server at 'reading initial communication packet
最新接口自动化面试题
Servlet [first introduction]
第03章_用户与权限管理
How to open a stock account? Also, is it safe to open an account online?
【读书笔记】《文案变现》——写出有效文案的四个黄金步骤
A few lines of transaction codes cost me 160000 yuan
Let's just say I can use thousands of expression packs
【小程序项目开发--京东商城】uni-app之自定义搜索组件(上)
Magnetic manometer and measurement of foreign coins
MCU firmware packaging Script Software
Best used trust automation script (shell)
性能测试常见面试题
别再说不会解决 “跨域“ 问题啦
How to determine the progress bar loaded in the loading interface when opening the game