Linux C/C++工程中可生成 ELF、动/静态库文件的通用 Makefile(二)

今天对之前发布的关于#%#$#%@%@%$#%$#%#%#$%@_e206a54e97690c++e50cc872dd70ee896 c/c++项目中生成elf、动态/静态库文件的通用makefile的文章进行了优化,增强了在当前目录下生成单个可执行文件的功能。

Linux C/C++工程中可生成 ELF、动/静态库文件的通用 Makefile(二)Linux C/C++工程中可生成 ELF、动/静态库文件的通用 Makefile(二)1 功能说明之前的功能不再重复说明,此次主要增强了在包含多个cpp文件的项目中生成一个可执行文件的能力(之前只能从单个cpp或c文件生成对应的可执行文件)。

如上图所示,在我的myRedisSentinel目录中包含了多个cpp文件,只需在SINGLE_BIN中配置想要输出的可执行文件名称,然后执行make -j4命令即可生成。

Linux C/C++工程中可生成 ELF、动/静态库文件的通用 Makefile(二)Linux C/C++工程中可生成 ELF、动/静态库文件的通用 Makefile(二)2 附录:Makefile 文件源码已将下面的 Makefile 源文件托管到 GitHub 仓库中:

AI卡通生成器 AI卡通生成器

免费在线AI卡通图片生成器 | 一键将图片或文本转换成精美卡通形象

AI卡通生成器 51 查看详情 AI卡通生成器

1、GitHub: https://www.php.cn/link/6d4a2c2688cbf0b68a09db10bf21c4f0 ;

立即学习“C++免费学习笔记(深入)”;

代码语言:javascript代码运行次数:0运行复制“`javascript#################################################################### FILENAME : Makefile# DESCRIPT : A general makefile to generate an ELF or a# dynamic or a static library for C/C++ project.# AUTHOR : vfhky 2015.08.07# URI : https://www.php.cn/link/2b243b78ebe97b9313128868aff49aeb: all clean helpall: # Some important on-off settings. You can not be too careful about them.DEBUG := y# Flag of generate a dynamic lib or a static lib: y means yes. If the target is a excutable file, it should be blank!GEN_LIBS := y# Flag of generate a dynamic lib: y means yes. It should be blank unless you want to generate a dynamic lib!GEN_DYN_LIB := y# generate a single target bin file.Please let it be blank unless the target is a excutable file.SINGLE_BIN :=# generate mutil target bin files.Please let it be blank unless the target is a excutable file.MUTIL_BIN :=# Name of the static lib. It should be blank unless the target is a static lib, then the GEN_LIBS is y and GEN_DYN_LIB is blank.# STATIC_LIBS := libsrcpbl.a# Name of the dynamic lib. It should be blank unless the target is a dynamic lib, then the GEN_LIBS is y and GEN_DYN_LIB is y.DYNAMIC_LIBS := libsrcpbl.so# Environment settings. The value of PROJECT_DIR shoule be set in the nix system as the the absolute dir path of your project.# PROJECT_DIR := /home/test_usr#CURDIR := $(PROJECT_DIR)/src/pblCURDIR := $(shell pwd)PRG_BIN_DIR := $(PROJECT_DIR)/binPRG_LIB_DIR := $(PROJECT_DIR)/libPRG_INC_DIR := $(PROJECT_DIR)/include# Cross compile tools defined. You needn’t modify these vars below generally.AS := asLD := ldCC := gccCXX := g++CPP := $(CC) -EAR := ar rcsNM := nmSTRIP := stripRANLIB := ranlibSTD_OPT := -D_GNU_SOURCECC += -std=c99 $(STD_OPT)CXX += $(STD_OPT)# nix system tools defined. You needn’t modify these vars below generally.BLACK = “e[33;0m”RED = “e[31;1m”GREEN = “e[32;1m”YELLOW = “e[33;3m”BLUE = “e[34;1m”PURPLE = “e[35;1m”CYAN = “e[36;1m”WHITE = “e[37;1m”CP := cpSED := sedFIND := findMKDIR := mkdir -pXARGS := xargsMV := mvRM := rm -rf# Get .c, .cpp source files by searching from current directory.CUR_SRC_DIR = $(shell ls -AxR $(CURDIR)|grep “:”|tr -d ‘:’)CUR_SRC := $(foreach subdir,$(CUR_SRC_DIR),$(wildcard $(subdir)/.c $(subdir)/.cpp))#CUR_SRC := $(shell find . -name “.c” -o -name “.cpp”|sed -e ‘s,./,,’)CUR_C := $(filter %.c, $(CUR_SRC))CUR_CPP := $(filter %.cpp, $(CUR_SRC))# Get the include files, object files, dependent files by searching from PRG_INC_DIR.CUR_INC_DIR = $(shell ls -AxR $(PRG_INC_DIR)|grep “:”|tr -d ‘:’)CUR_INC := $(foreach subdir,$(CUR_INC_DIR),$(subdir)/.h)SRC_H := $(filter %.h, $(CUR_INC))#CUR_OBJ := $(addprefix $(PRG_BIN_DIR)/,$(strip $(CUR_CPP:.cpp=.o) $(CUR_C:.c=.o)))#CUR_OBJ := $(addprefix $(PRG_BIN_DIR)/,$(notdir $(CUR_CPP:.cpp=.o) $(CUR_C:.c=.o)))CUR_OBJ := $(strip $(CUR_CPP:.cpp=.o) $(CUR_C:.c=.o))#CUR_DEP := $(addprefix $(PRG_BIN_DIR)/,$(notdir $(CUR_CPP:.cpp=.d) $(CUR_C:.c=.d)))CUR_DEP := $(strip $(CUR_CPP:.cpp=.d) $(CUR_C:.c=.d))# Create directory in the header files, bin and library directory.$(foreach dirname,$(sort $(PRG_INC_DIR) $(PRG_BIN_DIR) $(PRG_LIB_DIR)), $(shell $(MKDIR) $(dirname)))# Complie and link variables. LD_LIBS means the dynamic or static library needed for the object file.CFLAGS := $(if $(DEBUG),-g -Wall, -O2 -Wall)CFLAGS += $(if $(GEN_DYN_LIB), $(addprefix -fPIC -I ,$(sort $(dir $(SRC_H)))), $(addprefix -I ,$(sort $(dir $(SRC_H)))))CXXFLAGS = $(CFLAGS)LDFLAGS := LD_LIB_DIR := #-L $(PRG_LIB_DIR)LD_LIBS := #-lsrcpbl -lmysqlclientXLD_FLG := -Xlinker “-(” $(LDFLAGS) -Xlinker “-)”# Add vpath.vpath %.h $(sort $(dir $(SRC_H)))vpath %.c $(sort $(dir $(CUR_C)))vpath %.cpp $(sort $(dir $(CUR_CPP)))# Generate depend files.ifneq “$(MAKECMDGOALS)” “clean”sinclude $(CUR_DEP)endif# Gen_depend(depend-file,source-file,object-file,cc). This command-package is used to generate a depend file with a postfix of .d.define gen_depend @set -e; $(RM) $1; $4 $(CFLAGS) -MM $2 | $(SED) ‘s,($(notdir $3)): ,$3: ,’ > $1.tmp; $(SED) -e ‘s/#.//’ -e ‘s/^[^:]: //’ -e ‘s/ *$$//’ -e ‘/^$$/ d’ -e ‘s/$$/ :/’ > $1.tmp; $(MV) $1.tmp $1;endef# Rules to generate objects file(.o) from .c or .cpp files.$(CURDIR)/%.o: $(CURDIR)/%.c @$(call gen_depend,$(patsubst %.o,%.d,$@),$

以上就是Linux C/C++工程中可生成 ELF、动/静态库文件的通用 Makefile(二)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/451722.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
原神3.3版本新增活动任务玩法有哪些-3.3版本新增活动玩法攻略汇总
上一篇 2025年11月7日 23:35:06
微软视频编辑工具 Clipchamp 新增 AI 自动创作和 AI 文本转语音功能
下一篇 2025年11月7日 23:35:09

相关推荐

  • 如何在Linux中创建软链接和硬链接?

    软链接是独立文件,指向原路径,可跨文件系统,原文件删除后失效;硬链接共享inode,不可跨文件系统或链接目录,删除一个不影响其他。 在Linux中,软链接(符号链接)和硬链接是两种不同的文件引用方式。它们都能让你通过另一个路径访问文件,但底层机制不同,使用场景也有所区别。 什么是软链接和硬链接 软链…

    2026年9月9日
    000
  • VSCode快捷键:代码行移动技巧

    使用快捷键Alt+↑/↓(Windows/Linux)或Option+↑/↓(macOS)可快速移动单行或多行代码,提升编码效率。 在 VSCode 中高效移动代码行,能大幅提升编码流畅度。不需要复制粘贴或手动剪切,几个快捷键就能快速调整代码顺序。 向上/向下移动当前行 选中某一行或让光标位于该行,…

    2026年9月9日
    000
  • 如何在mysql中优化UPDATE和DELETE操作

    答案:优化MySQL的UPDATE和DELETE操作需确保WHERE条件字段有索引,避免全表扫描;对大批量数据分批处理,每次限制影响行数;避免长事务,减少锁争用;选用InnoDB引擎并合理配置缓冲池和日志文件,执行前用EXPLAIN分析计划。 在MySQL中,UPDATE和DELETE操作如果处理不…

    2026年9月9日
    000
  • Swoole的Serialize模块有什么应用场景

    Swoole的Serialize模块提供高效PHP变量序列化,适用于IPC、异步任务、协程缓存及RPC场景,支持闭包与对象,性能优于原生serialize,但仅限Swoole环境使用,不推荐跨语言或持久化存储。 Swoole的Serialize模块主要用于高效地序列化和反序列化PHP变量,尤其在需要…

    2026年9月9日
    000
  • 如何在mysql中优化数据缓存机制

    优先调优InnoDB缓冲池,设innodb_buffer_pool_size为内存50%~70%,启用预加载和多实例;审慎使用查询缓存,仅在读多写少时开启并监控命中率;逐步淘汰MyISAM,合理设置key_buffer_size;结合OS缓存与SSD提升I/O性能。 MySQL 的性能优化离不开高效…

    2026年9月9日
    000
  • MySQL外键约束如何使用_对数据完整性有什么保障?

    MySQL外键约束如何使用_对数据完整性有什么保障?MySQL外键约束如何使用_对数据完整性有什么保障?MySQL外键约束如何使用_对数据完整性有什么保障?MySQL外键约束如何使用_对数据完整性有什么保障?

    外键是mysql中维护数据完整性的关键机制,它通过建立表间关联,确保一个表的数据必须与另一个表数据对应。外键(foreign key)是一个表中引用另一表主键的字段,限制其取值只能为被引用表中的已有值或null。例如,orders表的user_id字段可设为外键,引用users表的id字段。添加外键…

    2026年9月9日 用户投稿
    100
  • VSCode里面怎么注释代码_VSCode快速注释与取消注释操作教程

    答案:VSCode中行注释快捷键为Ctrl+/(或Cmd+/),用于快速标记或禁用单行多行代码;块注释快捷键为Shift+Alt+A,适用于注释大段代码或添加多行说明。两者分别适用于细粒度标注和整体代码块处理,提升代码可读性与维护性。可通过键盘快捷方式设置自定义注释快捷键,解决冲突或优化操作习惯。插…

    2026年9月9日
    100
  • Azkaban Two Server模式部署

    azkaban two server模式的部署 Two Server模式是将Azkaban和MySQL分开部署的方案,下面详细介绍这种部署方式。 1、准备工作 结点规划 node1:azkaban-web、azkaban-exec node2:MySQL 这里我将Azkaban的相关服务放置在一台服…

    2026年9月9日
    000
  • mysql中如何备份单个表数据

    使用mysqldump可备份MySQL单表,语法为mysqldump -u [用户] -p [数据库] [表] > [文件路径],如备份mydb库的users表:mysqldump -u root -p mydb users > users_backup.sql;加–no-c…

    2026年9月9日
    100
  • VS Code工作台定制:面板布局与视图管理

    调整侧边栏与面板位置、管理视图可见性与分组、自定义活动栏图标、保存布局适配多工作区,可打造高效个性化开发环境。 Visual Studio Code(简称 VS Code)的强大之处不仅在于其轻量与扩展性,还体现在高度可定制的工作台布局。合理调整面板与视图布局,能显著提升开发效率。通过灵活管理编辑器…

    2026年9月9日
    200
  • 如何在Linux上启用SELinux_Linux上启用SELinux的配置步骤

    首先检查SELinux状态,使用sestatus命令查看是否启用及当前模式;若未安装工具则先安装selinux-utils或policycoreutils;临时启用强制模式可用setenforce 1;永久启用需编辑/etc/selinux/config文件,设置SELINUX=enforcing和…

    2026年9月9日
    100
  • 如何在mysql中使用事务处理订单系统

    使用事务确保订单系统数据一致性,通过BEGIN开启事务,将订单创建、库存扣减、余额更新等操作置于同一事务中,结合条件判断与异常处理,任一环节失败则ROLLBACK回滚,成功则COMMIT提交,需采用InnoDB引擎并确保应用层正确控制事务流程。 在MySQL中使用事务处理订单系统,关键在于确保订单创…

    2026年9月9日
    000
  • 如何检测内存条是否存在隐性故障?

    答案是使用MemTest86等专业工具结合物理检查与排除法可有效检测内存隐性故障。首先通过清理金手指和插槽排除接触不良,再用MemTest86进行多轮深度测试以发现间歇性错误,辅以Prime95、OCCT等压力工具验证稳定性,最后通过单根内存条逐一测试定位问题模块,因隐性故障常在高负载、特定模式下才…

    2026年9月9日
    200
  • 如何在Linux命令行中统计系统资源?

    掌握Linux系统资源统计需使用top、htop查看CPU与内存使用,free和/proc/meminfo分析内存状态,df、du检查磁盘空间,iostat监控I/O性能,uptime、ps、vmstat评估系统负载与进程情况。 在Linux命令行中统计系统资源,主要通过一系列内置命令来查看CPU、…

    2026年9月9日
    000
  • Linux文件系统路径与特殊字符处理技巧

    正确处理Linux特殊字符路径需先用引号或转义符,如空格用” “或,*、?、$等需转义或单引号保护,-开头文件用–分隔,脚本中变量用”$var”引用,避免解析错误。 在Linux系统中,文件路径和特殊字符的处理是日常操作中的常见问题。路径中…

    2026年9月9日
    100
  • 如何在mysql中查看用户权限

    使用SHOW GRANTS FOR ‘用户名’@’主机名’可查看指定用户权限,如SHOW GRANTS FOR ‘john’@’localhost’;2. 执行SHOW GRANTS可查看当前登录用户权限…

    2026年9月9日
    000
  • 如何在Linux中管理挂载点目录?

    掌握Linux挂载点管理需理解挂载机制,使用mkdir创建、umount卸载、rmdir删除目录,通过mount、findmnt、df查看状态,编辑/etc/fstab实现自动挂载,用UUID避免设备名变化问题,卸载前处理“device is busy”等异常,遵循创建→挂载→使用→卸载→删除的生命…

    2026年9月9日
    100
  • 如何在Linux中监控磁盘健康状态?

    使用smartctl工具检测磁盘健康,通过SMART技术评估硬盘状态,安装smartmontools后运行sudo smartctl -H /dev/sda检查健康状况,PASSED表示正常,FAILED需立即处理;启用smartd守护进程实现自动监控并配置邮件告警,结合df、iostat等命令监测…

    2026年9月9日
    300
  • 如何在mysql中修复复制中断问题

    MySQL复制中断多由数据不一致、网络或配置问题导致,需通过SHOW SLAVE STATUSG检查状态,根据Slave_IO_Running、Slave_SQL_Running、Last_Error等字段定位问题;常见如主键冲突可设sql_slave_skip_counter跳过,表结构不一致需手…

    2026年9月9日
    100
  • VS Code远程开发实战:WSL集成与端口转发配置指南

    VS Code与WSL深度集成可提升跨平台开发效率,通过远程扩展在Windows上使用Linux工具链。首先启用WSL并安装Ubuntu等发行版,推荐使用WSL 2以获得更好性能;接着安装VS Code及Remote-WSL扩展,通过“Remote-WSL: New Window”命令打开连接至WS…

    2026年9月9日
    000

发表回复

登录后才能评论
关注微信