【问题标题】:How to compile multiple C source File to Object File using Makefile如何使用 Makefile 将多个 C 源文件编译为目标文件
【发布时间】:2019-03-30 02:57:37
【问题描述】:

这是 makefile 代码,我使用“make”执行它。

CC=arm-none-eabi-gcc
CXX = arm-none-eabi-g++
BUILD_PATH = ../../build
dir_guard=mkdir -p $(@D)
STATIC_OPENTHREAD_LIB = $(BUILD_PATH)/third_party/libopenthread.a
AR = arm-none-eabi-gcc-ar -cr 

TARGET_OPENTHREAD_SRC_PATH = openthread


NRF_802154_MODULE_NAME = nrf_802154
NRF_802154_MODULE_PATH ?= $(PROJECT_ROOT)/third_party/$(NRF_802154_MODULE_NAME)

TARGET_NRF_802154_PATH = $(NRF_802154_MODULE_PATH)



INCLUDE_DIRS := openthread/include/
INCLUDE_DIRS := openthread/third_party/NordicSemiconductor/drivers/radio/rsch/raal/softdevice 
INCLUDE_DIRS := openthread/third_party/NordicSemiconductor/drivers/radio/rsch/raal
INCLUDE_DIRS := openthread/third_party/NordicSemiconductor/drivers/radio/hal
INCLUDE_DIRS := openthread/third_party/NordicSemiconductor/drivers/radio
INCLUDE_DIRS := openthread/third_party/NordicSemiconductor/nrfx/mdk
INCLUDE_DIRS := openthread/third_party/NordicSemiconductor/nrfx
INCLUDE_DIRS := openthread/third_party/NordicSemiconductor/dependencies
INCLUDE_DIRS := openthread/include/openthread
INCLUDE_DIRS := openthread/include/openthread/platform
INCLUDE_DIRS := $(TARGET_NRF_802154_PATH)/nrf_802154/src
INCLUDE_DIRS := $(TARGET_NRF_802154_PATH)/nrf_802154/src
INCLUDE_DIRS := $(TARGET_NRF_802154_PATH)/nrf_802154/src/fem
INCLUDE_DIRS := $(TARGET_NRF_802154_PATH)/nrf_802154/src/hal
INCLUDE_DIRS := $(TARGET_NRF_802154_PATH)/nrf_802154/src/mac_features
INCLUDE_DIRS := $(TARGET_NRF_802154_PATH)/nrf_802154/src/platform/clock
INCLUDE_DIRS := $(TARGET_NRF_802154_PATH)/nrf_802154/src/platform/temperature
INCLUDE_DIRS := $(TARGET_NRF_802154_PATH)/nrf_802154/src/platform/timer
INCLUDE_DIRS := $(TARGET_NRF_802154_PATH)/nrf_802154/src/raal
INCLUDE_DIRS := $(TARGET_NRF_802154_PATH)/nrf_802154/src/raal/softdevice
INCLUDE_DIRS := $(TARGET_NRF_802154_PATH)/nrf_802154/src/timer_scheduler
INCLUDE_DIRS := $(TARGET_OPENTHREAD_SRC_PATH)/examples/platforms
INCLUDE_DIRS := $(TARGET_OPENTHREAD_SRC_PATH)/include/openthread
INCLUDE_DIRS := openthread/third_party/NordicSemiconductor/drivers/clock
INCLUDE_DIRS := openthread/third_party/NordicSemiconductor/nrfx/hal
INCLUDE_DIRS := openthread/third_party/NordicSemiconductor/nrfx/drivers/include
INCLUDE_DIRS := openthread/third_party/NordicSemiconductor/libraries/app_error
INCLUDE_DIRS := openthread/src/core
INCLUDE_DIRS := openthread/third_party/NordicSemiconductor/cmsis
INCLUDE_DIRS := openthread/third_party/NordicSemiconductor/nrfx/mdk/

CFLAGS += -DENABLE_DEBUG_LOG=1 -DENABLE_DEBUG_GPIO=0 -DENABLE_DEBUG_ASSERT=0  
CFLAGS += -DSTM32_DEVICE -DnRF52840 -DNRF52840_XXAA -DPLATFORM_THREADING=1 -DPLATFORM_ID=14 -DPLATFORM_NAME=xenon -DUSBD_VID_SPARK=0x2B04 -DUSBD_PID_DFU=0xD00E -DUSBD_PID_CDC=0xC00E -g3 -gdwarf-2 -Os -mcpu=cortex-m4 -mthumb -mabi=aapcs -mfloat-abi=hard -mfpu=fpv4-sp-d16 -DSOFTDEVICE_PRESENT=1 -DS140 -DINCLUDE_PLATFORM=1 -DOPENTHREAD_PROJECT_CORE_CONFIG_FILE=\"openthread-config-project.h\" -DENABLE_FEM=1 -DNRF_802154_PROJECT_CONFIG=\"openthread-platform-config.h\" -DRAAL_SOFTDEVICE=1 -D_WIZCHIP_=W5500 -fno-builtin -DUSE_STDPERIPH_DRIVER -DDFU_BUILD_ENABLE -DLFS_CONFIG=lfs_config.h -DSYSTEM_VERSION_STRING=0.8.0-rc.27 -DRELEASE_BUILD 

CFLAGS += -DENABLE_FEM=1 -Werror
CFLAGS += -DNRF_802154_PROJECT_CONFIG=\"openthread-platform-config.h\"
CFLAGS += -DRAAL_SOFTDEVICE=1
CFLAGS += -DNRF52840_AAAA=0 -DNRF52840_AABA=0

CFLAGS += -DNRF52840_AAAA=0 -DNRF52840_AABA=0
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/nrf_802154_notification_swi.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/nrf_802154_priority_drop_swi.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/nrf_802154_request_swi.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/nrf_802154_swi.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/rsch/raal/softdevice/nrf_raal_softdevice.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/nrf_802154.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/nrf_802154_ack_pending_bit.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/nrf_802154_core.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/nrf_802154_core_hooks.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/nrf_802154_critical_section.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/nrf_802154_debug.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/nrf_802154_pib.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/nrf_802154_revision.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/rsch/nrf_802154_rsch.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/nrf_802154_rssi.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/nrf_802154_rx_buffer.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/nrf_802154_timer_coord.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/fem/nrf_fem_control.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/mac_features/nrf_802154_precise_ack_timeout.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/mac_features/nrf_802154_csma_ca.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/mac_features/nrf_802154_delayed_trx.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/mac_features/nrf_802154_filter.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/platform/clock/nrf_802154_clock_sdk.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/platform/hp_timer/nrf_802154_hp_timer.c
CSRC += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio/timer_scheduler/nrf_802154_timer_sched.c

ALLOBJ := $(addprefix $(BUILD_PATH)/, $(CSRC:.c=.o))

all:$(ALLOBJ)

%.o: %.c
    echo $^

clean:
    rm -rf $(BUILD_PATH)

但它失败并显示以下错误消息:

make: *** No rule to make target '../../build/openthread/third_party/NordicSemiconductor/drivers/radio/nrf_802154_notification_swi.o', needed by 'all'.  Stop

它似乎无法识别该模式。

% 模式必须识别被调用但它不起作用的规则

我想要做的是我的源代码在不同的目录中,我想构建一个可以编译 C 并在不同目录中创建对象的 makefile,然后想使用 AR 创建 .a 库。

【问题讨论】:

  • 在我看来,您的所有 INCLUDE_DIRS 陈述都是错误的。他们使用:= 而不是+=
  • := 和 += 的区别?总之
  • 第二个是加法(它添加到前一个)。第一个替换(秒 Inond 替换第一个,意味着第一个丢失)。在您自己的帖子中查看CSRC 中的用法。在代码中,a = 1; a = 2 表示a == 2,而a = 1; a += 1; 表示a == 3
  • 和含义:=

标签: makefile gnu-make


【解决方案1】:

您的模式规则无法匹配,因为您要匹配两边的整个路径名。但是您的路径前缀不一样,例如

  • 源文件$(TARGET_OPENTHREAD_SRC_PATH)/third_party/...
  • 目标文件../../build/$(TARGET_OPENTHREAD_SRC_PATH)/third_party/...

简单的解决方法是:

ALLOBJ := $(addprefix $(BUILD_PATH)/, $(CSRC:.c=.o))

$(ALLOBJ): $(BUILD_PATH)/%.o: %.c
        .... compiler command line goes in here ....

但更简单的方法是使用 VPATH 代替,即告诉 make 在哪里查找源文件并从源文件中完全删除路径:

# location of the source files (you can have multiple source directories too)
VPATH += $(TARGET_OPENTHREAD_SRC_PATH)/third_party/NordicSemiconductor/drivers/radio

CSRC += nrf_802154_notification_swi.c

ALLOBJ := $(addprefix $(BUILD_PATH)/, $(CSRC:.c=.o))

$(ALLOBJ): $(BUILD_PATH)/%.o: %.c
        .... compiler command line goes in here ....

【讨论】:

  • 先生,但问题是我的源代码位于不同的目录中,我必须指定所有不同的目录和 .c 文件,这不是太冗长的任务吗?因为我必须将源代码文件与该路径匹配
  • 正如我提到的,您可以将多个目录分配给VPATH。第二种选择是将源根目录分配给VPATH,并从源文件名中去除根部分。当您使用它时:您可以使用相同的目录列表为CFLAGS 生成-I 列表。
  • 哦,这意味着我不必为源文件设置绝对路径,我只需要这样做。分配源代码的根目录,它会找到上面提到的源文件?
  • 没错。我建议阅读我在答案中链接到的 GNU make 手册部分。
猜你喜欢
  • 1970-01-01
  • 2013-08-13
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多