c语言编译过程
# 预处理 -> 编译 -> 汇编 -> 链接
# 预处理: 将头文件替换中内容全部替换成实际内容 (.i 结尾), 不会检查错误
示例: gcc -E hello.c -o hello.i
# 编译: 检查错误,生成汇编文件 (.s 结尾)
示例: gcc -S hello.i -o hello.s
# 汇编: 将汇编文件编译成二进制文件 (.o 结尾)
示例: gcc - c hello.s -o hello.o
# 编译: 将各个文件的二进制文件链接起来生成可执行文件
示例: gcc hello.o xxx.o ... -o hello
使用make的好处
如果你是对自己的代码很熟悉的话, 体量比较小, 使用脚本控制gcc 编译也是可以的
- 主要它本身有一套很灵活的机制, 当代码体量很大的时候使用make能够更加体现出它的便捷之处
- 增量编译: 使用makefile可以只对已修改的文件做编译,不过前提是要保留之前编译的 .o 文件
makefile 写法示例
progName= StorgProg
# 将 .o 文件放在 build 文件夹中
objects = main.o logger.o thread_recvcmd.o util-files.o util_mmap.o util-gpio.o util-keepoff.o util-string.o thread_manager.o sys_resource.o common.o stru_queue.o sys_init.o drv_pcie.o pcie_proce.o vlan_proce.o info_apper.o oper_device.o
run: $(objects)
cc -o StorgProg -g -w -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE -pthread -lm $(objects)
# .o 文件为中间文件,当增量编译时需要保留 .o 文件
main.o: main.c
logger.o: logger.c logger.h
thread_recvcmd.o: thread_recvcmd.c thread_recvcmd.h
util-files.o: util-files.c util-files.h
util_mmap.o: util_mmap.c util_mmap.h
util-gpio.o: util-gpio.c util-gpio.h
util-keepoff.o: util-keepoff.c util-keepoff.h
util-string.o: util-string.c util-string.h
thread_manager.o: thread_manager.c thread_manager.h
sys_resource.o: sys_resource.c sys_resource.h
common.o: common.c common.h
stru_queue.o: stru_queue.c stru_queue.h
sys_init.o: sys_init.c sys_init.h
drv_pcie.o: drv_pcie.c drv_pcie.h
pcie_proce.o: pcie_proce.c pcie_proce.h
vlan_proce.o: vlan_proce.c vlan_proce.h
info_apper.o: info_apper.c info_apper.h
oper_device.o: oper_device.c oper_device.h
clean:
-rm -rf $(objects)
cleanAll:
-rm -rf $(objects)
-rm -rf StorgProg
系统,gcc,make版本
系统版本: Centos8
[root@node2]# cat /proc/version
Linux version 4.18.0-305.3.1.el8.x86_64 ([email protected]) (gcc version 8.4.1 20200928 (Red Hat 8.4.1-1) (GCC)) #1 SMP Tue Jun 1 16:14:33 UTC 2021
[root@node2]# gcc -v
使用内建 specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/8/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
目标:x86_64-redhat-linux
配置为:../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --with-isl --disable-libmpx --enable-offload-targets=nvptx-none --without-cuda-driver --enable-gnu-indirect-function --enable-cet --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
线程模型:posix
gcc 版本 8.4.1 20200928 (Red Hat 8.4.1-1) (GCC)
[root@node2]# make -v
GNU Make 4.2.1
为 x86_64-redhat-linux-gnu 编译
Copyright (C) 1988-2016 Free Software Foundation, Inc.
许可证:GPLv3+:GNU 通用公共许可证第 3 版或更新版本<http://gnu.org/licenses/gpl.html>。
本软件是自由软件:您可以自由修改和重新发布它。
在法律允许的范围内没有其他保证。
标签:gcc,enable,thread,--,Makefile,util,proce,写法
From: https://www.cnblogs.com/han-guang-xue/p/16874472.html