Я компилирую два файла с помощью clang 6.0: testA.c
и testB.c
.
В обоих файлах я запускаю специальный проход компилятора, который вставляет инициализированную нулем глобальную переменную с именем globalVarTest
. Я установил связь такой глобальной переменной как LinkOnceODRLinkage
.
Теперь, когда я связываю testA.c
и testB.c
вместе (то есть объектные файлы, полученные путем их компиляции отдельно), компоновщик жалуется, что существует несколько определений globalVarTest
.
Разве LinkOnceODRLinkage
не должен сообщать компоновщику, что, если оба определения совпадают, символы совпадают, и поэтому он может выбрать любое из двух определений при построении конечного исполняемого файла?
UPDATE:
Та же процедура работает в Linux. Это ограничение компоновщика Windows? Я смог добиться того же эффекта, используя разделы COMDAT, но мне интересно, почему LLVM не использует этот механизм автоматически, и мне не требуется явно устанавливать COMDATS.