c-当链接.o对象时,Makfile同时生成`(.text+0x0):多重定义`和`(.txt+0x44):对`erro



我有下面的makefile,虽然它可以很好地构建各个对象文件,但我无法用它将对象链接到最终的可执行文件中。它在构建主目标时同时输出(.text+0x0): multiple definition(.text+0x44): undefined reference to错误。

# Set compiler
CC = gcc
# Include headers 
INC_HDR := -I. -IAPI/core -IAPI/platform
# Define final executable 
EXE := driver 
# List source
SRC := $(wildcard API/core/*.c) 
$(wildcard API/platform/*.c) 
main.c 
# List headers
HDR := $(wildcard API/core/*.h) 
$(wildcard API/platform/*.h) 
# Derive objects
OBJ := $(patsubst %.c, %.o, $(SRC))
# Set flags 
CPPFLAGS := $(INC_HDR) -MMD -MP # -I is a preprocessor flag, not a compiler flag -MMD -MP
CFLAGS   := -Wall           # some warnings about bad code
LDFLAGS  := -L.             # -L is a linker flag
LDLIBS   := -lm             # Left empty if no libs are needed
.PHONY: all clean 
all: $(EXE)
$(EXE): $(OBJ) 
@echo Linking $@
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDLIBS) $^ -o $@ 
$(OBJ): $(SRC) $(HDR)
@echo Building $@ 
$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
clean:
@find . -type f -name '*.o' -delete
@find . -type f -name '*.d' -delete

这个问题与其他帖子非常接近,但到目前为止我还没能找到问题所在。

根据要求,make clean all的输出为:

Building API/core/VL53L1X_calibration.o
gcc -I. -IAPI/core -IAPI/platform -MMD -MP  -Wall                -c API/core/VL53L1X_calibration.c -o API/core/VL53L1X_calibration.o
Building API/core/VL53L1X_api.o
gcc -I. -IAPI/core -IAPI/platform -MMD -MP  -Wall                -c API/core/VL53L1X_calibration.c -o API/core/VL53L1X_api.o
Building API/platform/vl53l1_platform.o
gcc -I. -IAPI/core -IAPI/platform -MMD -MP  -Wall                -c API/core/VL53L1X_calibration.c -o API/platform/vl53l1_platform.o
Building main.o
gcc -I. -IAPI/core -IAPI/platform -MMD -MP  -Wall                -c API/core/VL53L1X_calibration.c -o main.o
Linking driver
gcc -I. -IAPI/core -IAPI/platform -MMD -MP  -Wall                -lm              API/core/VL53L1X_calibration.o API/core/VL53L1X_api.o API/platform/vl53l1_platform.o main.o -o driver 
API/core/VL53L1X_api.o: In function `VL53L1X_CalibrateOffset':
VL53L1X_calibration.c:(.text+0x0): multiple definition of `VL53L1X_CalibrateOffset'
API/core/VL53L1X_calibration.o:VL53L1X_calibration.c:(.text+0x0): first defined here
API/core/VL53L1X_api.o: In function `VL53L1X_CalibrateXtalk':
VL53L1X_calibration.c:(.text+0x170): multiple definition of `VL53L1X_CalibrateXtalk'
API/core/VL53L1X_calibration.o:VL53L1X_calibration.c:(.text+0x170): first defined here
API/platform/vl53l1_platform.o: In function `VL53L1X_CalibrateOffset':
VL53L1X_calibration.c:(.text+0x0): multiple definition of `VL53L1X_CalibrateOffset'
API/core/VL53L1X_calibration.o:VL53L1X_calibration.c:(.text+0x0): first defined here
API/platform/vl53l1_platform.o: In function `VL53L1X_CalibrateXtalk':
VL53L1X_calibration.c:(.text+0x170): multiple definition of `VL53L1X_CalibrateXtalk'
API/core/VL53L1X_calibration.o:VL53L1X_calibration.c:(.text+0x170): first defined here
main.o: In function `VL53L1X_CalibrateOffset':
VL53L1X_calibration.c:(.text+0x0): multiple definition of `VL53L1X_CalibrateOffset'
API/core/VL53L1X_calibration.o:VL53L1X_calibration.c:(.text+0x0): first defined here
main.o: In function `VL53L1X_CalibrateXtalk':
VL53L1X_calibration.c:(.text+0x170): multiple definition of `VL53L1X_CalibrateXtalk'
API/core/VL53L1X_calibration.o:VL53L1X_calibration.c:(.text+0x170): first defined here
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
API/core/VL53L1X_calibration.o: In function `VL53L1X_CalibrateOffset':
VL53L1X_calibration.c:(.text+0x44): undefined reference to `VL53L1_WrWord'
VL53L1X_calibration.c:(.text+0x5c): undefined reference to `VL53L1_WrWord'
VL53L1X_calibration.c:(.text+0x74): undefined reference to `VL53L1_WrWord'
VL53L1X_calibration.c:(.text+0x82): undefined reference to `VL53L1X_StartRanging'
VL53L1X_calibration.c:(.text+0xa3): undefined reference to `VL53L1X_CheckForDataReady'
VL53L1X_calibration.c:(.text+0xc0): undefined reference to `VL53L1X_GetDistance'
VL53L1X_calibration.c:(.text+0xce): undefined reference to `VL53L1X_ClearInterrupt'
VL53L1X_calibration.c:(.text+0xfa): undefined reference to `VL53L1X_StopRanging'
VL53L1X_calibration.c:(.text+0x14f): undefined reference to `VL53L1_WrWord'
API/core/VL53L1X_calibration.o: In function `VL53L1X_CalibrateXtalk':
VL53L1X_calibration.c:(.text+0x1cf): undefined reference to `VL53L1_WrWord'
VL53L1X_calibration.c:(.text+0x1dd): undefined reference to `VL53L1X_StartRanging'
VL53L1X_calibration.c:(.text+0x201): undefined reference to `VL53L1X_CheckForDataReady'
VL53L1X_calibration.c:(.text+0x21e): undefined reference to `VL53L1X_GetSignalRate'
VL53L1X_calibration.c:(.text+0x233): undefined reference to `VL53L1X_GetDistance'
VL53L1X_calibration.c:(.text+0x241): undefined reference to `VL53L1X_ClearInterrupt'
VL53L1X_calibration.c:(.text+0x26f): undefined reference to `VL53L1X_GetSpadNb'
VL53L1X_calibration.c:(.text+0x2c3): undefined reference to `VL53L1X_StopRanging'
VL53L1X_calibration.c:(.text+0x376): undefined reference to `VL53L1_WrWord'
API/core/VL53L1X_api.o: In function `VL53L1X_CalibrateOffset':
VL53L1X_calibration.c:(.text+0x44): undefined reference to `VL53L1_WrWord'
VL53L1X_calibration.c:(.text+0x5c): undefined reference to `VL53L1_WrWord'
VL53L1X_calibration.c:(.text+0x74): undefined reference to `VL53L1_WrWord'
VL53L1X_calibration.c:(.text+0x82): undefined reference to `VL53L1X_StartRanging'
VL53L1X_calibration.c:(.text+0xa3): undefined reference to `VL53L1X_CheckForDataReady'
VL53L1X_calibration.c:(.text+0xc0): undefined reference to `VL53L1X_GetDistance'
VL53L1X_calibration.c:(.text+0xce): undefined reference to `VL53L1X_ClearInterrupt'
VL53L1X_calibration.c:(.text+0xfa): undefined reference to `VL53L1X_StopRanging'
VL53L1X_calibration.c:(.text+0x14f): undefined reference to `VL53L1_WrWord'
API/core/VL53L1X_api.o: In function `VL53L1X_CalibrateXtalk':
VL53L1X_calibration.c:(.text+0x1cf): undefined reference to `VL53L1_WrWord'
VL53L1X_calibration.c:(.text+0x1dd): undefined reference to `VL53L1X_StartRanging'
VL53L1X_calibration.c:(.text+0x201): undefined reference to `VL53L1X_CheckForDataReady'
VL53L1X_calibration.c:(.text+0x21e): undefined reference to `VL53L1X_GetSignalRate'
VL53L1X_calibration.c:(.text+0x233): undefined reference to `VL53L1X_GetDistance'
VL53L1X_calibration.c:(.text+0x241): undefined reference to `VL53L1X_ClearInterrupt'
VL53L1X_calibration.c:(.text+0x26f): undefined reference to `VL53L1X_GetSpadNb'
VL53L1X_calibration.c:(.text+0x2c3): undefined reference to `VL53L1X_StopRanging'
VL53L1X_calibration.c:(.text+0x376): undefined reference to `VL53L1_WrWord'
API/platform/vl53l1_platform.o: In function `VL53L1X_CalibrateOffset':
VL53L1X_calibration.c:(.text+0x44): undefined reference to `VL53L1_WrWord'
VL53L1X_calibration.c:(.text+0x5c): undefined reference to `VL53L1_WrWord'
VL53L1X_calibration.c:(.text+0x74): undefined reference to `VL53L1_WrWord'
VL53L1X_calibration.c:(.text+0x82): undefined reference to `VL53L1X_StartRanging'
VL53L1X_calibration.c:(.text+0xa3): undefined reference to `VL53L1X_CheckForDataReady'
VL53L1X_calibration.c:(.text+0xc0): undefined reference to `VL53L1X_GetDistance'
VL53L1X_calibration.c:(.text+0xce): undefined reference to `VL53L1X_ClearInterrupt'
VL53L1X_calibration.c:(.text+0xfa): undefined reference to `VL53L1X_StopRanging'
VL53L1X_calibration.c:(.text+0x14f): undefined reference to `VL53L1_WrWord'
API/platform/vl53l1_platform.o: In function `VL53L1X_CalibrateXtalk':
VL53L1X_calibration.c:(.text+0x1cf): undefined reference to `VL53L1_WrWord'
VL53L1X_calibration.c:(.text+0x1dd): undefined reference to `VL53L1X_StartRanging'
VL53L1X_calibration.c:(.text+0x201): undefined reference to `VL53L1X_CheckForDataReady'
VL53L1X_calibration.c:(.text+0x21e): undefined reference to `VL53L1X_GetSignalRate'
VL53L1X_calibration.c:(.text+0x233): undefined reference to `VL53L1X_GetDistance'
VL53L1X_calibration.c:(.text+0x241): undefined reference to `VL53L1X_ClearInterrupt'
VL53L1X_calibration.c:(.text+0x26f): undefined reference to `VL53L1X_GetSpadNb'
VL53L1X_calibration.c:(.text+0x2c3): undefined reference to `VL53L1X_StopRanging'
VL53L1X_calibration.c:(.text+0x376): undefined reference to `VL53L1_WrWord'
main.o: In function `VL53L1X_CalibrateOffset':
VL53L1X_calibration.c:(.text+0x44): undefined reference to `VL53L1_WrWord'
VL53L1X_calibration.c:(.text+0x5c): undefined reference to `VL53L1_WrWord'
VL53L1X_calibration.c:(.text+0x74): undefined reference to `VL53L1_WrWord'
VL53L1X_calibration.c:(.text+0x82): undefined reference to `VL53L1X_StartRanging'
VL53L1X_calibration.c:(.text+0xa3): undefined reference to `VL53L1X_CheckForDataReady'
VL53L1X_calibration.c:(.text+0xc0): undefined reference to `VL53L1X_GetDistance'
VL53L1X_calibration.c:(.text+0xce): undefined reference to `VL53L1X_ClearInterrupt'
VL53L1X_calibration.c:(.text+0xfa): undefined reference to `VL53L1X_StopRanging'
VL53L1X_calibration.c:(.text+0x14f): undefined reference to `VL53L1_WrWord'
main.o: In function `VL53L1X_CalibrateXtalk':
VL53L1X_calibration.c:(.text+0x1cf): undefined reference to `VL53L1_WrWord'
VL53L1X_calibration.c:(.text+0x1dd): undefined reference to `VL53L1X_StartRanging'
VL53L1X_calibration.c:(.text+0x201): undefined reference to `VL53L1X_CheckForDataReady'
VL53L1X_calibration.c:(.text+0x21e): undefined reference to `VL53L1X_GetSignalRate'
VL53L1X_calibration.c:(.text+0x233): undefined reference to `VL53L1X_GetDistance'
VL53L1X_calibration.c:(.text+0x241): undefined reference to `VL53L1X_ClearInterrupt'
VL53L1X_calibration.c:(.text+0x26f): undefined reference to `VL53L1X_GetSpadNb'
VL53L1X_calibration.c:(.text+0x2c3): undefined reference to `VL53L1X_StopRanging'
VL53L1X_calibration.c:(.text+0x376): undefined reference to `VL53L1_WrWord'
collect2: error: ld returned 1 exit status
makefile:33: recipe for target 'driver' failed
make: *** [driver] Error 1

如果您查看这些行:

Building API/core/VL53L1X_calibration.o
gcc -I. -IAPI/core -IAPI/platform -MMD -MP  -Wall -c API/core/VL53L1X_calibration.c -o API/core/VL53L1X_calibration.o
Building API/core/VL53L1X_api.o
gcc -I. -IAPI/core -IAPI/platform -MMD -MP  -Wall -c API/core/VL53L1X_calibration.c -o API/core/VL53L1X_api.o
Building API/platform/vl53l1_platform.o
gcc -I. -IAPI/core -IAPI/platform -MMD -MP  -Wall -c API/core/VL53L1X_calibration.c -o API/platform/vl53l1_platform.o
Building main.o
gcc -I. -IAPI/core -IAPI/platform -MMD -MP  -Wall -c API/core/VL53L1X_calibration.c -o main.o

您将看到您正在使用相同的源文件来创建每个对象文件。因此,该函数中定义的任何内容都将被多次定义,而没有定义的内容将被未定义。

这是因为您如何定义对象文件的目标:

$(OBJ): $(SRC) $(HDR)

应该是:

%.o: %.c $(HDR)

最新更新