Полагаю, ваш вызов компиляции / ссылки идет как
gcc test.c ext.c
В этом случае test.c и ext.c (а точнее, файлы .o, созданные из них) являются равноправными, т.е. е. на том же уровне. Как компоновщик должен знать, какую версию символа main
взять, а какую отказаться? Компоновщик не знает об используемых файлах включения.
В случае с основной функцией правильный путь - использовать в своем проекте ровно одну из них.
Для любой другой функции, для которой у вас есть это требование, есть несколько способов:
Либо вы могли бы объявить одного из них "слабым". Он будет отброшен, когда будет "сильный".
Или вы поместили свою функцию в библиотеку, e. г. libext.a
. Если вы свяжете это с -ext
, из него будут удалены только объектные файлы, которые определяют символы, которые не определены. Но опять же, конфликт имен может произойти, если уже определено другое имя, определенное этим объектным файлом. Поэтому лучше всего определять как можно меньше символов в объектном файле.