几个好用的makefile 几乎可以不用修改

本文提供了三种实用的Makefile模板,分别用于生成可执行文件、静态链接库及动态链接库。通过简单的配置即可快速编译项目。

Makefile

      用 makefile 来编译工程,对很多朋友来说都是一件麻烦而痛苦的事情,这里我写了几个 makefile ,专门提供给那些曾经被makefile 困扰的朋友,根据生成的目标文件不同,我将 makefile 分成了三份:生成可执行文件的 makefile,生成静态链接库德 makefile ,生成动态链接库的 makefile 。

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

      是不是真的有这么神奇?呵呵,你自己用用就知道了。

      当然,如果要用到什么库文件,你还需要修改一些编译参数,这个可以对照我转载的另一篇文章《 GNU make 指南》。

      下面是三个 makefile 的源代码:

 

      1 、生成可执行文件的 makefile

######################################

#

# Generic makefile

#

# by Coon Xu

# email: coonxu@126.com

#

# Copyright (c) 2005 Coon Xu

# All rights reserved.

# No warranty, no liability;

# you use this at your own risk.

#

# You are free to modify and

# distribute this without giving

# credit to the original author.

#

######################################

 

 

#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)

 

      2 、生成静态链接库的 makefile

######################################

#

# Generic Static Library makefile

#

# by Coon Xu

# email: coonxu@126.com

#

# Copyright (c) 2005 Coon Xu

# All rights reserved.

# No warranty, no liability;

# you use this at your own risk.

#

# You are free to modify and

# distribute this without giving

# credit to the original author.

#

######################################

 

#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)

 

      3 、生成动态链接库的 makefile

######################################

#

# Generic Share Library makefile

#

# by Coon Xu

# email: coonxu@126.com

#

# Copyright (c) 2005 Coon Xu

# All rights reserved.

# No warranty, no liability;

# you use this at your own risk.

#

# You are free to modify and

# distribute this without giving

# credit to the original author.

#

######################################

 

#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)



来源:http://blog.sina.com.cn/s/blog_4e3c6b480100th47.html

<think>我们想要修改HighTec编译过程中生成的Makefile文件。通常,HighTec IDE(基于Eclipse)会自动生成Makefile,但有时我们需要自定义构建过程。以下是几种方法: 1. **修改项目设置以影响生成的Makefile**: 在HighTec IDE中,项目属性中有许多设置会影响生成的Makefile,例如包含路径、预定义宏、编译器选项等。 2. **使用自定义的Makefile模板**: 我们可以提供一个模板Makefile,然后让HighTec使用这个模板生成最终的Makefile。 3. **在构建前后添加自定义步骤**: 在项目属性中,可以添加构建前和构建后的步骤,执行自定义命令。 4. **完全覆盖自动生成的Makefile**: 禁用自动生成的Makefile,使用自己的Makefile。但要注意,这需要手动维护,可能会失去IDE的一些便利。 下面分别详述这些方法: ### 方法1:通过项目设置修改生成的Makefile 在HighTec IDE中: 1. 右键单击项目 -> Properties 2. 选择 C/C++ Build -> Settings 3. 在左侧选择相应的工具(如TriCore C Compiler, TriCore C++ Compiler, TriCore Assembler等) 4. 在右侧修改选项,例如: - 在“Preprocessor”中添加包含路径(-I)和宏定义(-D) - 在“Optimization”中修改优化级别 - 在“Debugging”中设置调试信息格式 - 在“Miscellaneous”中添加其他编译器选项 这些设置会反映在生成的Makefile中。 ### 方法2:使用自定义Makefile模板 HighTec IDE使用模板来生成Makefile。我们可以修改这个模板: 1. 找到HighTec的模板文件。通常位于安装目录的`/plugins`子目录下,例如: `C:\HighTec\toolchains\<tricore-version>\plugins\org.eclipse.cdt.managedbuilder.core_<version>\templates` 2. 复制相应的模板文件(如`Makefile.template`)到项目目录中。 3. 修改项目属性,指定使用自定义模板: - 右键项目 -> Properties - 选择 C/C++ Build -> Tool Chain Editor - 在右侧选择“Advanced...” - 在“Makefile generation”部分,选择“Use custom makefile template” - 指定模板文件的路径(项目中的路径) 4. 清理并重新构建项目,新的Makefile将基于你的模板生成。 ### 方法3:添加构建前后步骤 在项目属性中: 1. 进入 C/C++ Build -> Settings 2. 选择“Build Steps”选项卡 3. 在“Pre-build steps”或“Post-build steps”中添加自定义命令。 例如,在构建前生成一些代码: ```bash echo "Pre-build step: generating code" python generate_code.py ``` ### 方法4:完全自定义Makefile(禁用自动生成) 1. 禁用自动生成的Makefile: - 右键项目 -> Properties - 选择 C/C++ Build - 取消选择“Generate Makefiles automatically” 2. 在项目根目录下创建自己的Makefile,例如`Makefile`。 3. 编写自己的Makefile,示例: ```makefile # 自定义Makefile示例 PROJECT_NAME = my_project OUTPUT = output.elf # 工具链设置 CC = tcctc AS = tcastc LD = tcldtc # 包含路径 INCLUDES = -I./include -I"C:/HighTec/toolchains/tricore/v6.0.0.0/include" # 编译器选项 CFLAGS = -tct -g3 -O2 $(INCLUDES) -DDEBUG # 源文件 SRC_C = src/main.c src/app.c SRC_ASM = src/startup.asm # 目标文件 OBJS = $(SRC_C:.c=.o) $(SRC_ASM:.asm=.o) # 链接脚本 LINKER_SCRIPT = tc23x.ld all: $(OUTPUT) $(OUTPUT): $(OBJS) $(LD) -tlf -Wl,--map-file="$(PROJECT_NAME).map" -o $@ $^ -T $(LINKER_SCRIPT) %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ %.o: %.asm $(AS) -tas -g3 -o $@ $< clean: rm -f $(OBJS) $(OUTPUT) $(PROJECT_NAME).map .PHONY: all clean ``` ### 注意事项: - 使用自定义Makefile时,需要确保路径设置正确,特别是工具链的路径。如果工具链已添加到系统PATH,则可以直接使用`tcctc`等命令,否则需要指定完整路径。 - 链接脚本(.ld文件)通常需要与项目匹配,可以在HighTec安装目录下找到示例,或使用项目自动生成的链接脚本。 ### 修改自动生成Makefile的另一种方法(不推荐直接修改) HighTec每次清理构建都会重新生成Makefile,因此直接修改生成的Makefile不是长久之计。但如果你需要临时修改,可以: 1. 在项目构建后,修改生成的Makefile(位于`Debug`或`Release`目录下)。 2. 然后再次构建,但注意清理后修改会丢失。 ### 总结 推荐使用方法2(自定义模板)或方法4(完全自定义Makefile),具体取决于项目需求。如果只是调整编译选项,使用方法1即可。 §§相关问题§§: 1. 如何在HighTec IDE中添加自定义的构建步骤? 2. 如何为HighTec项目配置不同的构建配置(如Debug和Release)? 3. 在自定义Makefile中,如何管理AURIX TriCore的复杂依赖关系? 4. 如何将第三方库集成到HighTec项目中?</think>### 在 HighTec 中自定义生成 Makefile 的完整指南 在 HighTec 开发环境中修改生成的 Makefile 有多种方法,以下是详细解决方案: #### 1. **使用项目配置覆盖默认设置** ```makefile # 在项目根目录创建 custom.mk 文件 # 此文件会被自动包含在生成的 Makefile 中 # 覆盖编译器选项 CFLAGS += -O3 -fomit-frame-pointer -fstrict-aliasing # 添加自定义包含路径 INCLUDES += -I$(PROJECT_ROOT)/custom_libs # 添加预处理器宏 DEFINES += -DUSE_CUSTOM_DRIVER -DDEBUG_LEVEL=2 # 添加自定义链接选项 LDFLAGS += -Wl,--gc-sections -Wl,--print-memory-usage # 添加后构建步骤 POST_BUILD = python3 $(PROJECT_ROOT)/scripts/post_build.py ``` **说明**: - HighTec 会自动包含项目中的 `.mk` 文件 - 使用 `+=` 运算符追加选项(避免覆盖默认设置) - 变量命名必须与 HighTec 的内部变量一致 #### 2. **修改模板文件(高级方法)** HighTec 的 Makefile 模板位于: ``` <HighTec_Install_Dir>/plugins/org.eclipse.cdt.managedbuilder.core_<version>/templates ``` 修改模板的步骤: 1. 备份原始模板文件 2. 编辑 `Makefile.template` 文件 3. 添加自定义规则: ```makefile # 在模板末尾添加自定义目标 .PHONY: custom_target custom_target: @echo "Running custom pre-build steps" $(SHELL) $(PROJECT_ROOT)/scripts/pre_build.sh # 修改默认构建规则 $(BUILD_DIR)/%.o: %.c @echo "Custom compile rule for: $<" $(CC) $(CFLAGS) $(INCLUDES) $(DEFINES) -c $< -o $@ $(SHELL) $(PROJECT_ROOT)/scripts/post_compile.sh $@ ``` #### 3. **使用构建后处理脚本** ```bash #!/bin/bash # post_generate_makefile.sh # 此脚本在 Makefile 生成后执行 MAKEFILE_PATH="$1" # 添加自定义目标 echo -e "\n# Custom targets added by post-processing script" >> "$MAKEFILE_PATH" echo "flash:" >> "$MAKEFILE_PATH" echo -e "\topenocd -f $(PROJECT_ROOT)/config/openocd.cfg -c \"program \${OUTPUT} verify reset exit\"" >> "$MAKEFILE_PATH" # 修改默认清理规则 sed -i '/^clean:/a \\trm -f $(PROJECT_ROOT)/logs/*.log' "$MAKEFILE_PATH" # 添加版本信息 echo "VERSION := 1.0.$(shell date +%Y%m%d)" >> "$MAKEFILE_PATH" echo "CFLAGS += -DBUILD_VERSION=\\\"\$(VERSION)\\\"" >> "$MAKEFILE_PATH" ``` **配置方法**: 1. 在项目属性中设置构建后步骤 2. 指定脚本路径:`${workspace_loc:/project_name/scripts/post_generate_makefile.sh} "${build_dir}/makefile"` #### 4. **使用条件包含文件** ```makefile # conditional_includes.mk # 根据构建类型设置不同选项 ifeq ($(BUILD_TYPE), Debug) CFLAGS += -g3 -Og -DDEBUG_ENABLED LDFLAGS += -Wl,--debug else ifeq ($(BUILD_TYPE), Release) CFLAGS += -Os -flto LDFLAGS += -Wl,--strip-all endif # 添加硬件特定选项 ifdef BOARD_VERSION ifeq ($(BOARD_VERSION), TC234) DEFINES += -DTC23x -DUSE_ETH=1 else ifeq ($(BOARD_VERSION), TC275) DEFINES += -DTC27x -DUSE_CAN=1 endif endif ``` #### 5. **完整自定义 Makefile 示例** ```makefile # 完全自定义的 Makefile(禁用自动生成) # 在项目属性中取消勾选 "Generate Makefiles automatically" # 工具链设置 TC_PATH ?= C:/HighTec/toolchains/tricore/v6.0.0.0 CC = $(TC_PATH)/bin/htc AS = $(TC_PATH)/bin/htasm LD = $(TC_PATH)/bin/htld OBJCOPY = $(TC_PATH)/bin/htobjcopy # 项目结构 SRC_DIR = src INC_DIR = include BUILD_DIR = build OUTPUT_DIR = output # 源文件 C_SOURCES = $(wildcard $(SRC_DIR)/*.c) ASM_SOURCES = $(wildcard $(SRC_DIR)/*.asm) OBJECTS = $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(C_SOURCES)) \ $(patsubst $(SRC_DIR)/%.asm,$(BUILD_DIR)/%.o,$(ASM_SOURCES)) # 目标文件 TARGET = $(OUTPUT_DIR)/firmware.elf BIN = $(OUTPUT_DIR)/firmware.bin HEX = $(OUTPUT_DIR)/firmware.hex # 编译选项 CFLAGS = -tct -g3 -O2 -I$(INC_DIR) -I$(TC_PATH)/include CFLAGS += -DUSE_ETH=1 -DDEBUG_LEVEL=2 ASFLAGS = -tas -g3 LDFLAGS = -tlf -Wl,--map-file="$(OUTPUT_DIR)/memory.map" LDFLAGS += -T $(TC_PATH)/config/tc23x.ld # 构建规则 all: $(BIN) $(HEX) $(BIN): $(TARGET) $(OBJCOPY) -O binary $< $@ $(HEX): $(TARGET) $(OBJCOPY) -O ihex $< $@ $(TARGET): $(OBJECTS) @mkdir -p $(OUTPUT_DIR) $(LD) $(LDFLAGS) -o $@ $^ $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c @mkdir -p $(@D) $(CC) $(CFLAGS) -c $< -o $@ $(BUILD_DIR)/%.o: $(SRC_DIR)/%.asm @mkdir -p $(@D) $(AS) $(ASFLAGS) $< -o $@ clean: rm -rf $(BUILD_DIR) $(OUTPUT_DIR) flash: $(BIN) openocd -f $(TC_PATH)/config/openocd.cfg -c "program $< verify reset exit" .PHONY: all clean flash ``` ### 配置方法总结 | **方法** | **适用场景** | **优点** | **缺点** | |----------|--------------|----------|----------| | **custom.mk 文件** | 小规模自定义 | 简单安全,无需修改模板 | 功能有限 | | **修改模板文件** | 全局自定义 | 影响所有新项目 | 需要管理员权限 | | **构建后脚本** | 动态修改 | 灵活强大 | 增加构建复杂度 | | **条件包含文件** | 多配置管理 | 支持不同构建类型 | 需要额外配置 | | **完全自定义** | 复杂项目 | 完全控制构建过程 | 维护成本高 | ### HighTec IDE 配置步骤 1. **禁用自动生成**: - 右键项目 → Properties - 选择 C/C++ Build - 取消勾选 "Generate Makefiles automatically" 2. **添加自定义文件**: - 在项目根目录创建 `custom.mk` - 在项目属性中添加包含路径: ``` ${workspace_loc:/project_name/custom.mk} ``` 3. **设置构建后步骤**: ```properties # 在构建配置中设置 build.postbuild.steps=python ${workspace_loc:/project_name/scripts/post_build.py} build.postbuild.enabled=true ``` ### 最佳实践建议 1. **版本控制**: - 将自定义的 Makefile 模板和脚本纳入版本控制 - 使用 `#-- CUSTOM START --` 和 `#-- CUSTOM END --` 标记自定义部分 2. **兼容性处理**: ```makefile # 检测 HighTec 版本 HIGHTEC_VERSION := $(shell $(CC) --version | head -1 | cut -d' ' -f3) # 版本特定选项 ifeq ($(shell echo "$(HIGHTEC_VERSION) >= 6.1" | bc), 1) CFLAGS += -fnew-optimizations else CFLAGS += -fold-optimizations endif ``` 3. **错误处理**: ```makefile # 在关键命令前添加破折号忽略错误 clean: -rm -rf $(BUILD_DIR) 2>/dev/null -rm -f $(OUTPUT_DIR)/*.hex 2>/dev/null # 检查工具链是否存在 CHECK_TOOLCHAIN: @which $(CC) >/dev/null || (echo "Error: HighTec toolchain not found"; exit 1) all: CHECK_TOOLCHAIN $(TARGET) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值