MS VC встраивает имя библиотеки «по умолчанию» в большинство объектных файлов. Эта библиотека (или эти библиотеки) будет связана, если вы не укажете иное с помощью опции компоновщика -nodefaultlib
. Если вы используете это само по себе, оно не связывает любые библиотеки по умолчанию. Вы также можете указать что-то вроде -nodefaultlib:mylib.lib
, в этом случае он связывает все библиотеки по умолчанию , за исключением , которые вы указываете здесь.
Чтобы использовать ваш пример, если вы используете:
cl simple.c
Он будет правильно компилироваться и связываться. Однако если вы используете:
cl simple.c -link -nodefaultlib
Вы получите:
simple.obj: ошибка LNK2019: неразрешенный внешний символ printf, на который ссылается функция main
ССЫЛКА: ошибка LNK2001: неразрешенный внешний символ mainCRTStartup
simple.exe: фатальная ошибка LNK1120: 2 неразрешенных внешних кода
Просто чтобы завершить, вы также можете использовать переключатель /Zl
компилятора, чтобы создать объект без какого-либо встраивания имени какой-либо библиотеки. Это предназначено (главным образом) для создания статических библиотек, поэтому они не будут встраивать имя библиотеки, с которой конфликтуют, как бы вы ни создавали код, который использует вашу библиотеку.