程序人生 | Makefile 常用模板 - 静态链接库/动态链接库/可执行文件

现代C++实战指南:从环境配置到性能优化 C++作为一门支持零成本抽象和直接硬件控制的系统级编程语言,其核心价值在于能够在提供高级抽象的同时保持极高的运行效率。这一特性使其在游戏引擎、高频交易、数据库和嵌入式系统等性能敏感领域成为无可替代的选择。理解C++的内存管理机制,特别是智能指针(如unique_ptr和shared_ptr)的应用,是编写健壮、安全代码的基础。现代C++标准(C++11/14/17/20)引入了自动类型推导、移动语义、Lambda表达式等特性,极大地提升了开发效率和代码性能。在实际工程中,掌握构建系统(如CMake)、包管理 阅读详情

本文首发于 2014-07-10 11:51:10

前言

本文把 makefile 分成了三份:生成可执行文件的 makefile,生成静态链接库的 makefile,生成动态链接库的 makefile。

这些 makefile 都很简单,一般都是一看就会用,用法也很容易,只需要把它们拷贝到你的代码的同一目录下,然后就可以用 make 来生成目标文件了。

下面是三个makefile的源代码:

生成可执行文件的 makefile

######################################
#
######################################
#source file
#源文件,自动找所有.c和.cpp文件,并将目标定义为同名.o文件
SOURCE  := $(wildcard *.c) $(wildcard *.cpp)
OBJS    := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE)))
  
#target you can change test to what you want
#目标文件名,输入任意你想要的执行文件名
TARGET  := test
  
#compile and lib parameter
#编译参数
CC      := gcc
LIBS    :=
LDFLAGS :=
DEFINES :=
INCLUDE := -I.
CFLAGS  := -g -Wall -O3 $(DEFINES) $(INCLUDE)
CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_H
  
  
#i think you should do anything here
#下面的基本上不需要做任何改动了
.PHONY : everything objs clean veryclean rebuild
  
everything : $(TARGET)
  
all : $(TARGET)
  
objs : $(OBJS)
  
rebuild: veryclean everything
                
clean :
    rm -fr *.so
    rm -fr *.o
    
veryclean : clean
    rm -fr $(TARGET)
  
$(TARGET) : $(OBJS)
    $(CC) $(CXXFLAGS) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)

生成静态链接库的 makefile

######################################
#
#
######################################
  
#target you can change test to what you want
#共享库文件名,lib*.a
TARGET  := libtest.a
  
#compile and lib parameter
#编译参数
CC      := gcc
AR      = ar
RANLIB  = ranlib
LIBS    :=
LDFLAGS :=
DEFINES :=
INCLUDE := -I.
CFLAGS  := -g -Wall -O3 $(DEFINES) $(INCLUDE)
CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_H
  
#i think you should do anything here
#下面的基本上不需要做任何改动了
  
#source file
#源文件,自动找所有.c和.cpp文件,并将目标定义为同名.o文件
SOURCE  := $(wildcard *.c) $(wildcard *.cpp)
OBJS    := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE)))
  
.PHONY : everything objs clean veryclean rebuild
  
everything : $(TARGET)
  
all : $(TARGET)
  
objs : $(OBJS)
  
rebuild: veryclean everything
                
clean :
    rm -fr *.o
    
veryclean : clean
    rm -fr $(TARGET)
  
$(TARGET) : $(OBJS)
    $(AR) cru $(TARGET) $(OBJS)
    $(RANLIB) $(TARGET)

生成动态链接库的 makefile

######################################
#
#
######################################
  
#target you can change test to what you want
#共享库文件名,lib*.so
TARGET  := libtest.so
  
#compile and lib parameter
#编译参数
CC      := gcc
LIBS    :=
LDFLAGS :=
DEFINES :=
INCLUDE := -I.
CFLAGS  := -g -Wall -O3 $(DEFINES) $(INCLUDE)
CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_H
SHARE   := -fPIC -shared -o
  
#i think you should do anything here
#下面的基本上不需要做任何改动了
  
#source file
#源文件,自动找所有.c和.cpp文件,并将目标定义为同名.o文件
SOURCE  := $(wildcard *.c) $(wildcard *.cpp)
OBJS    := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE)))
  
.PHONY : everything objs clean veryclean rebuild
  
everything : $(TARGET)
  
all : $(TARGET)
  
objs : $(OBJS)
  
rebuild: veryclean everything
                
clean :
    rm -fr *.o
    
veryclean : clean
    rm -fr $(TARGET)
  
$(TARGET) : $(OBJS)
    $(CC) $(CXXFLAGS) $(SHARE) $@ $(OBJS) $(LDFLAGS) $(LIBS)

欢迎关注我的微信公众号【数据库内核】:分享主流开源数据库和存储引擎相关技术。

标题网址
GitHubhttps://dbkernel.github.io
知乎https://www.zhihu.com/people/…
思否(SegmentFault)https://segmentfault.com/u/db…
掘金https://juejin.im/user/5e9d3e…
开源中国(oschina)https://my.oschina.net/dbkernel
博客园(cnblogs)https://www.cnblogs.com/dbkernel
C++开发环境配置全攻略:从Visual Studio到VSCode+MinGW 在软件开发领域,环境配置是项目启动的基础环节,尤其对于C++这类编译型语言,其工具链的复杂性常成为初学者的首要挑战。理解编译器、编辑器和构建工具的原理,是掌握C++开发的关键。编译器作为核心,负责将源代码翻译为机器码,而编辑器或集成开发环境则提供代码编写与调试的工作台。正确的环境配置不仅能提升开发效率,更能加深对程序构建过程的理解,为后续学习内存管理、多线程等高级特性奠定坚实基础。本文聚焦于C++环境配置这一高频搜索主题,通过对比Visual Studio与VSCode+MinGW两套主流方案,详细解析了从 阅读详情

相关推荐

Makefile变量及动态库静态库

Makefile变量及动态库静态库。ar命令和动态库的封装。

渣渣馬的博客 2265

makefile 学习(2):C语言的编译及库文件的生成与链接

编译C语言的相关后缀.a 文件是一个静态库文件.c文件是c语言的源文件.hc语言的头文件.i是预处理文件.o目标文件.s汇编语言的文件.so动态库或者共享库或者称为运行时库.c文件在github中可以看到另一种后缀,比如.cc或者是其他的后缀,但是常用的还是.c后缀。在makefile 学习(1):C/C++ 编译过程, 我们讲到编译过程包括4个步骤: (1)预处理,(2)转换为汇编语言,(3) 生成目标文件(4) 链接为可执行文件。

@bangbang的博客 2804

用Docker部署ERPNext V15:从架构原理到生产落地的完整指南

容器化部署正在重塑企业级应用的分发与运维方式,ERPNext作为开源ERP中的佼佼者,其基于Frappe框架的模块化设计天然适合用Docker进行编排。理解容器、镜像与编排的关系,是掌握ERP系统部署的基础。Frappe框架负责数据模型与API,ERPNext则承载销售、采购、财务等业务逻辑,两者通过Docker容器解耦为可独立扩展的组件。这种架构带来的价值在于:环境一致性、快速迁移与弹性伸缩,使中小团队也能以较低成本自托管业务系统。无论是替代传统SaaS,还是构建内部管理平台,掌握容器化部署已成为运维与开

weixin_32325225的博客 139

Makefile静态库动态库的构建和链接之工程实用篇

现有C++工程目录结构如下:add.hadd.cppmain.cpp。

taifyang的博客 3268

【文献阅读笔记】之基于注意力机制的深度学习路面裂缝检测

中文,计算机辅助设计与图形学学报,第 32 卷 第 8 期,2020 年 8 月。 DOI: 10.3724/SP.J.1089.2020.18059 摘要: 为实现自动准确地检测路面裂缝, 提升路面裂缝检测效果, 提出了一种基于注意力机制的裂缝检测网络 (attention-based crack networks, ACNet). 该网络采用编码器-解码器网络构架, 编码器采用 ResNet34 为骨干网, 提取路面裂缝特征; 在编码器和解码器间加入基于注意力机制的特征模块(attention-b

qq_44785998的博客 7593

ERA5数据批量下载

ERA5再分析数据的IDM接管下载

qq_38734327的博客 3037

Linux | 动静态库 | 动静态链接 | makefile库打包 | 第三方库使用

Linux下的动静态库讲解,使用,如何打包

凡事都是靠练习 3936

从JTAG到AS模式:一文搞懂EP4CE10E22C8N所有配置引脚(MSEL, nCONFIG, DATA0)的用法

本文深入解析EP4CE10E22C8N FPGA的配置引脚(MSEL, nCONFIG, DATA0)在不同模式下的使用方法,特别关注从JTAG到AS模式的切换要点。通过详细的配置模式对比、状态机分析和PCB布局建议,帮助开发者避免常见陷阱,提升FPGA配置成功率。

weixin_33713350的博客 321

Makefile学习7:编译动态链接库和静态库

Makefile编译动态库和静态库

weixin_45783574的博客 1万+

看完让你的RSA提升一个台阶 [GKCTF 2021]RRRRsa

我是,今天我给大家分享一个关于RSA的题目,带大家领略的魅力。今天开始前,我们先学习一下。

m0_62102520的博客 853

使用 CFD 仿真进行阀门性能分析:第一部分

了解如何使用 Ansys Discovery 评估阀门性能,使工程师能够设计出更好的产品。

jkh920184196的博客 3148

Makefile知识整理

一、gcc -l参数和-L参数用法含义 1、-l 的用法 -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了(即gcc -lm) 2、-L 的用法 当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要

fengruoying93的专栏 2889

别只聊天了!手把手教你为Ollama+Open WebUI搭建本地知识库(基于BGE-M3和Qwen)

本文详细介绍了如何利用Ollama、Open WebUI和BGE-M3构建本地知识库,实现智能问答和文档检索。通过环境准备、文档处理、向量化实战和应用案例,帮助用户突破基础聊天场景,打造高效的个人知识管理体系。特别适合技术文档管理和学术研究场景。

weixin_42523720的博客 479

make、Makefile &静态库、动态库

场景说明: 文件如下,假设max.c和min.c是两个人分别设计实现的接口函数,当我们要使用其功能时,并不在意其实现细节。因此我们只要按照头文件max.h、min.h中的接口声明来调用函数功能即可。 max.c int max(int a, int b) { if(a>b){ return a; }else{..................

造梦先森Kai的专栏 8034

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Makefile:动态库的编译链接与使用(六)

首先准备一个main.cpp引入SoTest.h头文件,对SoTest进行继承并且重写几个函数。不管上面那种写法,最后lld main都能看到对应的libSoTest.so的路径在哪。动态链接库:不会把代码编译到二进制文件中,而是运行时才去加载,所以只需要维护一个地址。动态链接库文件的好处是程序和库文件分离,可以分别发行,库文件可以被多处共享。首先生成一个SoTest.h、SoTest.cpp分别存放类声明和定义。此时当前目录下会生成一个 libSoTest.so的文件表示动态库。使用下面的指令进行编译。

weixin_43808717的博客 2497

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Makefile库文件详解

Makefile库文件详解

周同学的博客 2051

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

动态库的makefile且链接静态库

需要考虑几个关键点:编译源文件、生成动态库、链接静态库、清理操作等。以下是一个简单的示例。编写一个Makefile来编译一个动态库,并链接第三方静态库时,可以按照以下步骤进行。假设有一个动态库需要编译,同时依赖一个名为。的静态库,以及需要编译成动态库的源文件。一个能够生成动态库并链接静态库的。

Charles梦想家 1689

Makefile学习笔记_02_静态库与动态库的编译与链接

自学B站某课程的笔记,欢迎小伙伴们共同讨论,若有理解不对的地方也欢迎指出。其中,此处的路径为当前工作路径,可以通过鼠标右击。进行编译,之后会生成liboperation.a文件,如下图。开发环境:Visual Studio Code + gcc。文件,但同样会生成exec文件,并可执行出同上一样的结果。命进行链接,输出文件名为exec。编译成库之后,就可以将其与我们的源文件进行链接。,则说明这个库没有添加到环境变量,使用以下代码。是需要链接为库的几个文件名,也就是。,库名和输出文件的名字自己取。

qq_41820167的博客 1839

(1)makefile:预处理、编译、汇编、链接、库文件

预处理、编译、汇编、链接、库文件

weixin_45981798的博客 417

Makefile简介及如何指定头文件和库文件

初学C/C++时,我们编译源文件时,通常直接敲命令去进行编译。但在实际项目中,源文件非常多,直接敲命令编译就不现实了,这时候就需要用到Makefile,Makefile是一个文本文件,我们只需要提前在Makefile中写好源文件的编译规则,然后直接执行make命令,就可以自动编译。

new9232的博客 1万+

makefile与动态链接库案例分析——动态库链接动态库

背景:效率考虑,要重用把服务器主备机方案,以库Libmdpha(高可用)的形式加进主工程dds(调度数据服务器)。 有源代码,打算直接编译Libmdpha.so.xxx,加入主工程dds。复制动态库到主工程相关路径,并改makefile,主要加复制命令和建立软连接的命令,库名注意统一: 引用库中加入Libmdpha 同时加         cp -f $(INTERFACES_

huqinwei的专栏 8139

创建makefile链接源文件和库生成可执行文件

这个错误信息是在链接阶段发生的,意味着链接器(ld)在尝试链接你的程序时遇到了问题。 这表示链接器找到了名为 libNetworkRuntime900_CM7_GCC.a 的静态库文件,但是因为它与当前的目标系统不兼容(可能是架构不匹配,比如库是为32位系统编译的,而你的系统是64位的,或者库是为不同的处理器架构编译的),所以链接器决定跳过这个库。

L888666Q的博客 702

Makefile 链接外部头文件和库文件

Makefile链接外部头文件和库文件

qq_40004575的博客 1132

Makefile 连接库文件的方法

Linux的静态库是以.a结尾的,要连接静态库有两种方法,一种是在编译命令最后直接加上库路径/库名称。例如你的库在绝对目录/lib/libtest.a下面 你就可以这样来编译 $(CC) $(CFLAGS) $^  -o $@  /lib/libtest.a 另外一种方法是,你可以用-L制定库德路径,用-l指定库的名称 例如库的名称为libtest.a 那么就用-ltest CROS

arick2013的专栏 9164

使用Makefile链接so库文件

初学Makefile,权当是笔记,希望对别人有些帮助吧。 ------------------------------------------------------------------------------------ 本次例子目录结构如下: 目录说明: lib目录是我自己写的一个so库文件,名为libA.so,很简单,里面的内容截图如下: -----------

friendan的专栏 3万+
上一篇: Ubuntu/Debian交叉编译安装ARM平台版本的ffmpeg
下一篇: Linux strace命令使用详解
dbkernel
博客等级 码龄4年 60粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值