解决 Zephyr 编译错误:重复定义符号 'pressButton' 和 'wasButtonPressed'
在 Zephyr 项目编译过程中,遇到了以下错误:
FAILED: zephyr/zephyr_pre0.elf zephyr/zephyr_pre0.map D:/0Document/HeadTracker/HeadTracker_ESP32/headtracker/build/zephyr/zephyr_pre0.map
cmd.exe /C "cd . && C:\Users\NineDay\zephyr-sdk-0.16.0\riscv64-zephyr-elf\bin\riscv64-zephyr-elf-gcc.exe -gdwarf-4 zephyr/CMakeFiles/zephyr_pre0.dir/misc/empty_file.c.obj -o zephyr\zephyr_pre0.elf zephyr/CMakeFiles/offsets.dir/./arch/riscv/core/offsets/offsets.c.obj -fuse-ld=bfd -Wl,-T zephyr/linker_zephyr_pre0.cmd -Wl,-Map=D:/0Document/HeadTracker/HeadTracker_ESP32/headtracker/build/zephyr/zephyr_pre0.map -Wl,--whole-archive app/libapp.a zephyr/libzephyr.a zephyr/arch/common/libarch__common.a zephyr/arch/arch/riscv/core/libarch__riscv__core.a zephyr/lib/libc/newlib/liblib__libc__newlib.a zephyr/drivers/interrupt_controller/libdrivers__interrupt_controller.a zephyr/drivers/clock_control/libdrivers__clock_control.a zephyr/drivers/console/libdrivers__console.a zephyr/drivers/flash/libdrivers__flash.a zephyr/drivers/gpio/libdrivers__gpio.a zephyr/drivers/i2c/libdrivers__i2c.a zephyr/drivers/pinctrl/libdrivers__pinctrl.a zephyr/drivers/sensor/mpu9250/libdrivers__sensor__mpu9250.a zephyr/drivers/serial/libdrivers__serial.a zephyr/drivers/timer/libdrivers__timer.a -Wl,--no-whole-archive zephyr/kernel/libkernel.a -L"c:/users/nineday/zephyr-sdk-0.16.0/riscv64-zephyr-elf/bin/../lib/gcc/riscv64-zephyr-elf/12.2.0" -LD:/0Document/HeadTracker/HeadTracker_ESP32/headtracker/build/zephyr -lgcc zephyr/arch/common/libisr_tables.a -mabi=ilp32 -march=rv32imc_zicsr -Wl,--gc-sections -Wl,--build-id=none -Wl,--sort-common=descending -Wl,--sort-section=alignment -Wl,-u,_OffsetAbsSyms -Wl,-u,_ConfigAbsSyms -nostdlib -static -Wl,-X -Wl,-N -Wl,--orphan-handling=warn -Wl,-no-pie -lm -Wl,-lc -L"C:/Users/NineDay/zephyr-sdk-0.16.0/riscv64-zephyr-elf/riscv64-zephyr-elf"/lib/. -u_printf_float -Wl,-lgcc -lc -lgcc -specs=nano.specs -TC:/Users/NineDay/zephyrproject/modules/hal/espressif/zephyr/esp32c3/src/linker/esp32c3.rom.alias.ld -TC:/Users/NineDay/zephyrproject/modules/hal/espressif/zephyr/esp32c3/../../components/esp_rom/esp32c3/ld/esp32c3.rom.ld -TC:/Users/NineDay/zephyrproject/modules/hal/espressif/zephyr/esp32c3/../../components/esp_rom/esp32c3/ld/esp32c3.rom.eco3.ld -TC:/Users/NineDay/zephyrproject/modules/hal/espressif/zephyr/esp32c3/../../components/esp_rom/esp32c3/ld/esp32c3.rom.api.ld -TC:/Users/NineDay/zephyrproject/modules/hal/espressif/zephyr/esp32c3/../../components/esp_rom/esp32c3/ld/esp32c3.rom.libgcc.ld -TC:/Users/NineDay/zephyrproject/modules/hal/espressif/zephyr/esp32c3/../../components/soc/esp32c3/ld/esp32c3.peripherals.ld && cmd.exe /C "cd /D D:\0Document\HeadTracker\HeadTracker_ESP32\headtracker\build\zephyr && "C:\Program Files\CMake\bin\cmake.exe" -E echo ""
c:/users/nineday/zephyr-sdk-0.16.0/riscv64-zephyr-elf/bin/../lib/gcc/riscv64-zephyr-elf/12.2.0/../../../../riscv64-zephyr-elf/bin/ld.bfd.exe: app/libapp.a(imu.c.obj): in function 'k_sem_give':
D:/0Document/HeadTracker/HeadTracker_ESP32/headtracker/build/zephyr/include/generated/syscalls/kernel.h:1089: multiple definition of 'pressButton'; app/libapp.a(application.c.obj):D:/0Document/HeadTracker/HeadTracker_ESP32/headtracker/build/zephyr/include/generated/syscalls/kernel.h:1089: first defined here
c:/users/nineday/zephyr-sdk-0.16.0/riscv64-zephyr-elf/bin/../lib/gcc/riscv64-zephyr-elf/12.2.0/../../../../riscv64-zephyr-elf/bin/ld.bfd.exe: app/libapp.a(imu.c.obj): in function 'wasButtonPressed':
D:/0Document/HeadTracker/HeadTracker_ESP32/headtracker/src/io.h:15: multiple definition of 'wasButtonPressed'; app/libapp.a(application.c.obj):D:/0Document/HeadTracker/HeadTracker_ESP32/headtracker/src/io.h:15: first defined here
c:/users/nineday/zephyr-sdk-0.16.0/riscv64-zephyr-elf/bin/../lib/gcc/riscv64-zephyr-elf/12.2.0/../../../../riscv64-zephyr-elf/bin/ld.bfd.exe: app/libapp.a(io.c.obj): in function 'k_sem_give':
D:/0Document/HeadTracker/HeadTracker_ESP32/headtracker/build/zephyr/include/generated/syscalls/kernel.h:1089: multiple definition of 'pressButton'; app/libapp.a(application.c.obj):D:/0Document/HeadTracker/HeadTracker_ESP32/headtracker/build/zephyr/include/generated/syscalls/kernel.h:1089: first defined here
c:/users/nineday/zephyr-sdk-0.16.0/riscv64-zephyr-elf/bin/../lib/gcc/riscv64-zephyr-elf/12.2.0/../../../../riscv64-zephyr-elf/bin/ld.bfd.exe: app/libapp.a(io.c.obj): in function 'wasButtonPressed':
D:/0Document/HeadTracker/HeadTracker_ESP32/headtracker/src/io.h:15: multiple definition of 'wasButtonPressed'; app/libapp.a(application.c.obj):D:/0Document/HeadTracker/HeadTracker_ESP32/headtracker/src/io.h:15: first defined here
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
这个错误是链接器(ld)报告的,它表示在链接时出现重复定义的符号(函数、变量等),这是因为同一个符号在多个目标文件中定义了多次。
具体来说,这个错误是因为在imu.c、io.c和application.c中都定义了pressButton和wasButtonPressed这两个函数,导致链接器无法确定使用哪个定义。
你需要在其中一个文件中将这些函数的定义删除或修改函数名,以解决这个问题。
另外,你的编译命令似乎很长,不太容易看出问题所在。你可以尝试使用更简单的命令来编译,或者使用类似于Makefile的构建系统来管理编译过程。
原文地址: https://www.cveoy.top/t/topic/n37N 著作权归作者所有。请勿转载和采集!