C 制作:“;系统找不到指定的路径";仅当使用makefile编译时?

C 制作:“;系统找不到指定的路径";仅当使用makefile编译时?,c,eclipse,makefile,gnu-make,C,Eclipse,Makefile,Gnu Make,我有一个C应用程序,我正试图用一个生成文件来构建它。当我打电话给make时,我得到: Compiling file: nrf_drv_rtc.c arm-none-eabi-gcc -mcpu=cortex-m0 -mthumb -mabi=aapcs --std=gnu99 -Wall -O0 -g3 -mfloat-abi=soft -ffunction-sections -fdata-sections -fno-strict-aliasing -c -o build/nrf_drv_rtc

我有一个C应用程序,我正试图用一个生成文件来构建它。当我打电话给make时,我得到:

Compiling file: nrf_drv_rtc.c
arm-none-eabi-gcc -mcpu=cortex-m0 -mthumb -mabi=aapcs --std=gnu99 -Wall -O0 -g3 -mfloat-abi=soft -ffunction-sections -fdata-sections -fno-strict-aliasing -c -o build/nrf_drv_rtc.o nrf51_sdk/drivers_nrf/rtc/nrf_drv_rtc.c
"C:/Program Files (x86)/GNU Tools ARM Embedded/4.9 2015q1/bin/arm-none-eabi-gcc" -mcpu=cortex-m0 -mthumb -mabi=aapcs --std=gnu99 -Wall -O0 -g3 -mfloat-abi=soft -ffunction-sections -fdata-sections -fno-strict-aliasing -c -o build/nrf_drv_rtc.o nrf51_sdk/drivers_nrf/rtc/nrf_drv_rtc.c
The system cannot find the path specified.
make[1]: *** [build/nrf_drv_rtc.o] Error 1
如果足够正确,则不会生成“build/nrf_drv_rtc.o”文件。奇怪的是,如果我复制这行:

arm-none-eabi-gcc -mcpu=cortex-m0 -mthumb -mabi=aapcs --std=gnu99 -Wall -O0 -g3 -mfloat-abi=soft -ffunction-sections -fdata-sections -fno-strict-aliasing -c -o build/nrf_drv_rtc.o nrf51_sdk/drivers_nrf/rtc/nrf_drv_rtc.c
为了cmd并运行它,它会很好地编译并生成“build/nrf\u drv\u rtc.o”

这是我的makefile:

PROJECT_NAME := ble_app_hrs_s110_pca10028

export OUTPUT_FILENAME
#MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
MAKEFILE_NAME := $(MAKEFILE_LIST)
MAKEFILE_DIR := $(dir $(MAKEFILE_NAME) ) 

TEMPLATE_PATH = nrf51_sdk/toolchain/gcc
ifeq ($(OS),Windows_NT)
include $(TEMPLATE_PATH)/Makefile.windows
else
include $(TEMPLATE_PATH)/Makefile.posix
endif

MK := mkdir
RM := rm -rf

#echo suspend
ifeq ("$(VERBOSE)","1")
NO_ECHO := 
else
NO_ECHO := @
endif

# Toolchain commands
CC              := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-gcc"
AS              := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-as"
AR              := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-ar" -r
LD              := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-ld"
NM              := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-nm"
OBJDUMP         := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-objdump"
OBJCOPY         := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-objcopy"
SIZE            := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-size"

#function for removing duplicates in a list
remduplicates = $(strip $(if $1,$(firstword $1) $(call remduplicates,$(filter-out $(firstword $1),$1))))

#source common to all targets
C_SOURCE_FILES += \
nrf51_sdk/drivers_nrf/rtc/nrf_drv_rtc.c \
Drivers/NRF51_BLEDriver.c \
(..... a lot more files ....)

#assembly files common to all targets
ASM_SOURCE_FILES  = nrf51_sdk/toolchain/gcc/gcc_startup_nrf51.s

#includes common to all targets
INC_PATHS  = -I Application/
(..... a lot more include paths.......)

OBJECT_DIRECTORY = _build
LISTING_DIRECTORY =$(OBJECT_DIRECTORY)
OUTPUT_BINARY_DIRECTORY =$(OBJECT_DIRECTORY)

# Sorting removes duplicates
BUILD_DIRECTORIES := $(sort $(OBJECT_DIRECTORY) $(OUTPUT_BINARY_DIRECTORY) $(LISTING_DIRECTORY) )

#flags common to all targets
CFLAGS  = -DSOFTDEVICE_PRESENT
CFLAGS += -DNRF51
CFLAGS += -DS110
CFLAGS += -DBOARD_PCA10028
CFLAGS += -DBLE_STACK_SUPPORT_REQD
CFLAGS += -mcpu=cortex-m0
CFLAGS += -mthumb -mabi=aapcs --std=gnu99
CFLAGS += -Wall -O0 -g3
CFLAGS += -mfloat-abi=soft
# keep every function in separate section. This will allow linker to dump unused functions
CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing
#CFLAGS += -flto -fno-builtin

# keep every function in separate section. This will allow linker to dump unused functions
LDFLAGS += -Xlinker -Map=$(LISTING_DIRECTORY)/$(OUTPUT_FILENAME).map
LDFLAGS += -mthumb -mabi=aapcs -L $(TEMPLATE_PATH) -T$(LINKER_SCRIPT)
LDFLAGS += -mcpu=cortex-m0
# let linker to dump unused sections
LDFLAGS += -Wl,--gc-sections
# use newlib in nano version
LDFLAGS += --specs=nano.specs -lc -lnosys

# Assembler flags
ASMFLAGS += -x assembler-with-cpp
ASMFLAGS += -DSOFTDEVICE_PRESENT
ASMFLAGS += -DNRF51
ASMFLAGS += -DS110
ASMFLAGS += -DBOARD_PCA10028
ASMFLAGS += -DBLE_STACK_SUPPORT_REQD
#default target - first one defined
#default: clean nrf51422_xxac_s110

#building all targets
all: #clean
    #$(NO_ECHO)$(MAKE) -f $(MAKEFILE_NAME) -C $(MAKEFILE_DIR) -e cleanobj
    $(NO_ECHO)$(MAKE) -f $(MAKEFILE_NAME) -C $(MAKEFILE_DIR) -e nrf51422_xxac_s110 

#target for printing all targets
help:
    @echo following targets are available:
    @echo   nrf51422_xxac_s110
    @echo   flash_softdevice


C_SOURCE_FILE_NAMES = $(notdir $(C_SOURCE_FILES))
C_PATHS = $(call remduplicates, $(dir $(C_SOURCE_FILES) ) )
C_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILE_NAMES:.c=.o) )

ASM_SOURCE_FILE_NAMES = $(notdir $(ASM_SOURCE_FILES))
ASM_PATHS = $(call remduplicates, $(dir $(ASM_SOURCE_FILES) ))
ASM_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(ASM_SOURCE_FILE_NAMES:.s=.o) )

vpath %.c $(C_PATHS)
vpath %.s $(ASM_PATHS)

OBJECTS = $(C_OBJECTS) $(ASM_OBJECTS)

nrf51422_xxac_s110: OUTPUT_FILENAME := nrf51422_xxac_s110
nrf51422_xxac_s110: LINKER_SCRIPT=ble_app_hrs_gcc_nrf51.ld
nrf51422_xxac_s110: $(BUILD_DIRECTORIES) $(OBJECTS)
    @echo Linking target: $(OUTPUT_FILENAME).out
    $(NO_ECHO)$(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out
    $(NO_ECHO)$(MAKE) -f $(MAKEFILE_NAME) -C $(MAKEFILE_DIR) -e finalize

## Create build directories
$(BUILD_DIRECTORIES):
    echo $(MAKEFILE_NAME)
    $(MK) $@

# Create objects from C SRC files
$(OBJECT_DIRECTORY)/%.o: %.c
    @echo Compiling file: $(notdir $<)
    @echo arm-none-eabi-gcc $(CFLAGS) $(INC_PATHS) -c -o $@ $<
    $(NO_ECHO)$(CC) $(CFLAGS) $(INC_PATHS) -c -o $@ $<

# Assemble files
$(OBJECT_DIRECTORY)/%.o: %.s
    @echo Compiling file: $(notdir $<)
    $(NO_ECHO)$(CC) $(ASMFLAGS) $(INC_PATHS) -c -o $@ $<


# Link
$(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out: $(BUILD_DIRECTORIES) $(OBJECTS)
    @echo Linking target: $(OUTPUT_FILENAME).out
    $(NO_ECHO)$(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out


## Create binary .bin file from the .out file
$(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out
    @echo Preparing: $(OUTPUT_FILENAME).bin
    $(NO_ECHO)$(OBJCOPY) -O binary $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin

## Create binary .hex file from the .out file
$(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out
    @echo Preparing: $(OUTPUT_FILENAME).hex
    $(NO_ECHO)$(OBJCOPY) -O ihex $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex

finalize: genbin genhex echosize

genbin:
    @echo Preparing: $(OUTPUT_FILENAME).bin
    $(NO_ECHO)$(OBJCOPY) -O binary $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin

## Create binary .hex file from the .out file
genhex: 
    @echo Preparing: $(OUTPUT_FILENAME).hex
    $(NO_ECHO)$(OBJCOPY) -O ihex $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex

echosize:
    -@echo ""
    $(NO_ECHO)$(SIZE) $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out
    -@echo ""

clean:
    $(RM) $(BUILD_DIRECTORIES)

cleanobj:
    $(RM) $(BUILD_DIRECTORIES)/*.o

flash: $(MAKECMDGOALS)
    @echo Flashing: $(OUTPUT_BINARY_DIRECTORY)/$<.hex
    nrfjprog --reset --program $(OUTPUT_BINARY_DIRECTORY)/$<.hex)

## Flash softdevice
flash_softdevice: 
    @echo Flashing: s110_softdevice.hex
    nrfjprog --reset --program nrf51_sdk/softdevice/s110/hex/s110_softdevice.hex
项目名称:=ble\U app\U hrs\U s110\U pca10028
导出输出文件名
#MAKEFILE_NAME:=$(CURDIR)/$(word$(words$(MAKEFILE_列表)),$(MAKEFILE_列表))
MAKEFILE_NAME:=$(MAKEFILE_列表)
MAKEFILE_DIR:=$(DIR$(MAKEFILE_NAME))
模板路径=nrf51\U sdk/toolchain/gcc
ifeq($(操作系统),Windows\u NT)
包括$(模板路径)/Makefile.windows
其他的
包括$(模板路径)/Makefile.posix
恩迪夫
MK:=mkdir
RM:=RM-rf
#回声暂停
ifeq($(详细)”,“1”)
无回声:=
其他的
无回声:=@
恩迪夫
#工具链命令
CC:=“$(GNU安装根)/bin/$(GNU前缀)-gcc”
AS:=“$(GNU安装根)/bin/$(GNU前缀)-AS”
AR:=“$(GNU安装根)/bin/$(GNU前缀)-AR”-r
LD:“$(GNU安装根)/bin/$(GNU前缀)-LD”
NM:=“$(GNU安装根)/bin/$(GNU前缀)-NM”
OBJDUMP:=“$(GNU安装根)/bin/$(GNU前缀)-OBJDUMP”
OBJCOPY:=“$(GNU安装根)/bin/$(GNU前缀)-OBJCOPY”
大小:=“$(GNU安装根)/bin/$(GNU前缀)-大小”
#用于删除列表中的重复项的函数
remduplicates=$(strip$(如果$1,$(firstword$1)$(调用remduplicates,$(过滤掉$(firstword$1,$1)))
#所有目标共用的源
C_源文件+=\
nrf51\u sdk/drivers\u nrf/rtc/nrf\u drv\u rtc.c\
驱动程序/NRF51_BLEDriver.c\
(…更多文件…)
#所有目标通用的程序集文件
ASM\u SOURCE\u FILES=nrf51\u sdk/toolchain/gcc/gcc\u startup\u nrf51.s
#包括对所有目标通用的
INC_路径=-I应用程序/
(……更多包括路径……)
对象\目录=\生成
清单\目录=$(对象\目录)
输出\二进制\目录=$(对象\目录)
#排序将删除重复项
构建目录:=$(排序$(对象目录)$(输出二进制目录)$(列表目录))
#所有目标通用的标志
CFLAGS=-dsoftu存在
CFLAGS+=-DNRF51
CFLAGS+=-DS110
CFLAGS+=-DBOARD_PCA10028
CFLAGS+=-DBLE\u堆栈\u支持\u需求
CFLAGS+=-mcpu=cortex-m0
CFLAGS+=-mthumb-mabi=aapcs--std=gnu99
CFLAGS+=-Wall-O0-g3
CFLAGS+=-mfloat abi=soft
#将每个函数放在单独的部分中。这将允许链接器转储未使用的函数
CFLAGS+=-fffunction节-fdata节-fno严格别名
#CFLAGS+=-flto-fno内置
#将每个函数放在单独的部分中。这将允许链接器转储未使用的函数
LDFLAGS+=-Xlinker-Map=$(列出目录)/$(输出文件名).Map
LDFLAGS+=-mthumb-mabi=aapcs-L$(模板路径)-T$(链接器脚本)
LDFLAGS+=-mcpu=cortex-m0
#让链接器转储未使用的节
LDFLAGS+=-Wl,--gc段
#在nano版本中使用newlib
LDFLAGS+=--specs=nano.specs-lc-lnosys
#汇编程序标志
带cpp的ASMFLAGS+=-x汇编程序
ASMFLAGS+=-DSOFT设备\u存在
ASMFLAGS+=-DNRF51
ASMFLAGS+=-DS110
ASMFLAGS+=-DBOARD_PCA10028
ASMFLAGS+=-DBLE\u堆栈\u支持\u要求
#默认目标-定义的第一个目标
#默认值:清洁nrf51422\u xxac\u s110
#建立所有目标
全部:#清洁
#$(无回声)$(生成)-f$(生成文件名)-C$(生成文件目录)-e清除对象
$(无回声)$(生成)-f$(生成文件名)-C$(生成文件目录)-e nrf51422\U xxac\U s110
#用于打印所有目标的目标
帮助:
@可以使用以下目标:
@回声nrf51422\u xxac\u s110
@回声闪光软设备
C_源文件名=$(notdir$(C_源文件))
C_路径=$(调用remduplicates,$(dir$(C_源文件)))
C_OBJECTS=$(addprefix$(OBJECT_DIRECTORY)/,$(C_源文件名称:.C=.o))
ASM\u源文件\u名称=$(notdir$(ASM\u源文件))
ASM_路径=$(调用remduplicates,$(dir$(ASM_源文件)))
ASM\u对象=$(addprefix$(对象\u目录)/,$(ASM\u源\u文件\u名称:.s=.o))
vpath%.c$(c_路径)
vpath%.s$(ASM\U路径)
对象=$(C_对象)$(ASM_对象)
nrf51422_xxac_s110:输出文件名:=nrf51422_xxac_s110
nrf51422\u xxac\u s110:LINKER\u SCRIPT=ble\u app\u hrs\u gcc\u nrf51.ld
nrf51422\u xxac\u s110:$(构建目录)$(对象)
@回显链接目标:$(输出文件名).out
$(无回音)$(CC)$(LDFLAGS)$(对象)$(LIBS)-o$(输出\u二进制\u目录)/$(输出\u文件名).out
$(无回声)$(生成)-f$(生成文件名称)-C$(生成文件目录)-e最终确定
##创建生成目录
$(生成目录):
echo$(MAKEFILE\u名称)
美元(MK)$@
#从C SRC文件创建对象
$(对象目录)/%.o:%.c

@echo编译文件:$(notdir$结果是,include:
include$(TEMPLATE\u PATH)/Makefile.windows
GNU\u INSTALL\u ROOT
变量定义为未安装在我的计算机上的编译器版本。因此我对其进行了更正,所有操作都非常有效。

如果使用完整路径
“C:/Program Files(x86)/GNU Tools ARM Embedded/4.9 2015q1/bin/ARM none eabi gcc”
?@NZD那么它就不工作了!我刚刚意识到我没有“4.9 2015q1”。我使用的是“4.9 2015q2”“为什么它会认为使用q1版本?所以将
GNU INSTALL\u ROOT
更改为
…q2
解决了这个问题?@alk我没有这样的系统变量?:(再次使用这个makefile?也许创建您自己的makefile会更容易,您的项目是如何构造的?