go build_error ai_generated true

ld: symbol 'foo' has multiple definitions (from object files a.o and b.o)

ID: go/cgo-multiple-definition-symbol

Also available as: JSON · Markdown · 中文
75%Fix Rate
85%Confidence
1Evidence
2023-11-05First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
Go 1.15 active — — —
Go 1.16 active — — —
Go 1.17 active — — —
Go 1.18 active — — —
Go 1.19 active — — —
Go 1.20 active — — —
Go 1.21 active — — —
Go 1.22 active — — —
Go 1.23 active — — —

Root Cause

Duplicate symbol definitions across C object files linked via cgo, often due to including the same .c file in multiple packages or using static libraries with conflicting symbols.

generic

中文

通过 cgo 链接的 C 目标文件之间存在重复符号定义,通常是由于在多个包中包含相同的 .c 文件或使用具有冲突符号的静态库。

Official Documentation

https://pkg.go.dev/cmd/cgo

Workarounds

  1. 85% success Ensure each .c file is compiled only once by consolidating cgo directives into a single package or using a single .go file with all C code
    Ensure each .c file is compiled only once by consolidating cgo directives into a single package or using a single .go file with all C code
  2. 70% success Use linker flag -Wl,--allow-multiple-definition to force link but verify behavior
    Use linker flag -Wl,--allow-multiple-definition to force link but verify behavior
  3. 80% success Refactor to avoid static libraries with overlapping symbols; use dynamic linking or rename symbols via objcopy
    Refactor to avoid static libraries with overlapping symbols; use dynamic linking or rename symbols via objcopy

中文步骤

  1. Ensure each .c file is compiled only once by consolidating cgo directives into a single package or using a single .go file with all C code
  2. Use linker flag -Wl,--allow-multiple-definition to force link but verify behavior
  3. Refactor to avoid static libraries with overlapping symbols; use dynamic linking or rename symbols via objcopy

Dead Ends

Common approaches that don't work:

  1. 60% fail

    This flag suppresses the error but can cause undefined behavior or crashes due to symbol aliasing.

  2. 50% fail

    If the duplicate comes from a static library you don't control, renaming isn't possible.

  3. 90% fail

    Multiple definitions occur at link time from different .o files, not from header inclusion; pragma doesn't help.