makefile编写---单个子目录编译自动变量模板ok

本文详细介绍了Makefile中变量的定义与使用方法,包括自动化变量通配符、wildcard函数的应用,以及如何通过patsubst进行文件扩展名转换。同时,文中还提供了具体的示例来帮助理解Makefile的构建过程。

1.自动化变量通配符http://blog.sina.com.cn/s/blog_7c95e5850101b38l.html

2.wildcard 使用http://blog.youkuaiyun.com/liangkaiming/article/details/6267357

3.srcs=(wildcard:%。o=%。c)说明

http://os.chinaunix.net/a2008/0312/978/000000978004.shtml

4.$(srcs):%.o:%.c说明==$(patsubst %.c,%.o $(wildcard  *.c))==$($(wildcard  *.c):%.c=%.o)

http://bbs.youkuaiyun.com/topics/380082064

http://www.linuxsir.org/bbs/thread205437.html

http://guliqun1983.blog.163.com/blog/static/50111685201171842740793/

5.规则http://www.cnblogs.com/pied/archive/2012/11/02/2751476.html

6.bug报错 http://zhidao.baidu.com/link?url=-TFGEM8kQx9O416zeRqcMkpkMP29aIcMYaNC-gteCQ62ydSfk5qJglEkr3h4-K3YofHfKfsDPsoGQr9qBELazq

http://www.baidu.com/#wd=%2Fusr%2Flib%2Fgcc%2Fi486-linux-gnu%2F4.4.3%2F..%2F..%2F..%2F..%2Flib%2Fcrt1.o%3A%20In%20function%20%60_start%27%3A&rsv_spt=1&rsv_bp=1&ie=utf-8&tn=baiduhome_pg&rsv_sug3=7&rsv_sug4=562&rsv_sug2=0&inputT=891&f=8&rsv_sug=1&bs=%25.c%3A%25.o&rsv_n=2

me:

Target  = auto

Cc = gcc
Cflags =  -Wall -O
Lflags = -lpthread
Include = -I
Ar = ar
Libs =

Srcs = $(wildcard *.c)
#$(wildcard,./sub/*.c) qudiao ','
Incs = $(wildcard *.h)
Objects = $(Srcs:%.c=%.o)

.PHONY:clean release install

all: release
print:
  @echo $(Srcs)
  @echo $(Incs)
  @echo $(Objects)
  @echo "why???"
release:$(Target)

$(Target):$(Objects)
 $(Cc)  $^  -o $@
 @echo $@
 @echo "pkf"
$(Objects):%.o:%.c $(Incs)          // this is not need!!!!!
 $(Cc) -c $< -o $@
 @echo $@
 @echo $<
clean:
 -rm *.o
 -rm $(Target)

 

 

 

 

exmple:

==============================================================
Target = TestIni
GCC = gcc
G++ = g++

CInc = $(wildcard *.h)
CSrc = $(wildcard *.c)

Cobjects =$(CSrc:%.c=%.o)
#Cobjects =$(patsubst %.c,%.o,$(CSrc))


release:$(Target)

$(Target): $(Cobjects)
$(GCC) -o $@ $^

 

##################test######################

#CInc += iniparser.h dictionary.h
#CSrc += iniparser.c dictionary.c
#Cobjects += iniparser.o dictionary.o
#CppObejects =
#$(Cobjects):$(Csrc)
# $(GCC) $(CInc) -c $<

#$(Target): iniparser.o dictionary.o
# $(GCC) -o $@ $^

#iniparser.o: iniparser.c
# $(GCC) $(CInc) -c $<
#dictionary.o: dictionary.c
# $(GCC) $(CInc) -c $<


clean:
rm -rf *.o $(Target) *.gch

===================================================

http://blog.youkuaiyun.com/liangkaiming/article/details/6267357

wildcard netdir patsubst

make -f makefile release

### STM32 `hdma_usart2_rx` 未定义引发的编译错误解决方案 在STM32项目中,遇到类似于`hdma_usart2_rx`未定义的编译错误通常是由于以下几个原因引起的: #### 1. 变量声明缺失 如果变量`hdma_usart2_rx`被使用但在当前文件中未找到其定义,则可能是该变量并未在任何头文件中正确定义或声明。通常情况下,在DMA初始化完成后,HAL库会在某个`.c`文件中创建此类句柄实例,并通过对应的头文件对外暴露。 解决方法之一是在项目的全局头文件(如`main.h`或其他公共头文件)中添加外部声明语句: ```c extern DMA_HandleTypeDef hdma_usart2_rx; ``` 这一步确保了即使实际定义位于其他源文件中,也可以正常访问此变量[^1]。 #### 2. 初始化代码遗漏 另一个常见原因是虽然有声明但缺少具体的初始化过程。例如,在某些自动生成的工程模板里可能仅配置了一部分外设而忽略了其余部分。对于USART2及其关联的DMA通道而言,应该检查是否存在如下形式的初始化函数调用: ```c MX_DMA_Init(); MX_USART2_UART_Init(); ``` 同时确认这些初始化操作确实包含了针对`hdma_usart2_rx`的相关设置逻辑。如果没有的话则需手动补充完整这部分内容[^4]。 #### 3. 配置选项不当 有时候也会因为CubeMx工具导出时选择了不同的参数组合而导致最终生成的代码结构有所差异。比如是否启用了特定串口的功能以及采用何种方式进行数据交换(中断还是DMA)等等都会影响到底层资源分配情况。因此建议重新审视原始设计文档或者按照需求调整相应选项后再重新生成整个工程项目框架[^3]。 #### 4. 文件链接问题 最后还有一种可能性就是尽管所有必要的组件都已经存在并正确编写好了各自的职责范围内的功能实现细节;但由于某种原因使得它们之间无法建立起有效的联系从而造成看似孤立的现象发生——即所谓的静态库/对象文件之间的相互依赖关系处理失误所致的结果表现出来就是这样一种状态下的症状描述而已啦! 此时应当仔细核对Makefile或者其他构建脚本里面关于目标平台特性描述的部分是否有误漏之处;另外也要留意各个子目录下面各自独立出来的C/C++源程序单元测试环节有没有妥善安排好顺序先后次序等问题哦😊~[^2] --- 以下是基于以上分析给出的一个综合性的修正示范例子供参考学习之用: 假设我们正在处理一个基于STM32F4系列微控制器开发板的应用场景... ```makefile # Makefile excerpt demonstrating proper inclusion of source files and libraries. SOURCES += \ src/main.c \ Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c \ Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c INCLUDES += \ Inc \ Drivers/STM32F4xx_HAL_Driver/Inc LIBRARIES += -lm # Standard math library may also be required depending on application needs. LDSCRIPT ?= STM32F407VGTx_FLASH.ld ``` 接着修改`main.h`, 添加如下行数: ```c #ifndef __MAIN_H__ #define __MAIN_H__ #include "stm32f4xx_hal.h" /* Add external declarations here */ extern DMA_HandleTypeDef hdma_usart2_rx; #endif /* __MAIN_H__ */ ``` 然后回到主要应用程序入口处(`main.c`)做适当改动以支持新的硬件抽象层次接口调用: ```c int main(void){ HAL_Init(); SystemClock_Config(); // Configure system clock according to user preferences MX_GPIO_Init(); // Initialize GPIO pins used throughout the project MX_DMA_Init(); // Enable global DMA controller & configure channels as needed MX_USART2_UART_Init();// Setup USART peripheral operating parameters including baudrate etc. uint8_t rxBuffer[64]; while (true){ if(HAL_OK != HAL_UART_Receive_DMA(&huart2, rxBuffer, sizeof(rxBuffer))){ Error_Handler(); } // Process received data... } } ``` 当然别忘了同步更新相应的驱动级封装定义文件(usart_driver.h/usart_driver.c),使其能够满足最新业务流程的要求. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值