Библиотека не указана, но printf связан с программой на C ++? - PullRequest
0 голосов
/ 14 ноября 2010

У меня есть следующий код:

#include <stdio.h>

int main()
{
    printf ("hello world\n");
    return 0;
}

Используя MSVC ++ 10.0 на Windows 7 x86, я компилирую его в командной строке следующим образом:

cl.exe simple.cpp

Это создает simple.exe(компилятор автоматически вызывает компоновщик), а исполняемый файл отображает сообщение "hello world", как и ожидалось.Когда я смотрю на исполняемый файл w / disabled.exe, он показывает kernel32.dll как единственную зависимость.Когда я копирую содержимое библиотеки kernel32.dll, printf не отображается.

Использует ли VC ++ какую-то оптимизацию, чтобы printf каким-то образом был включен непосредственно в конечный исполняемый файл?Если да, то как и где это задокументировано?

Заранее большое спасибо -

Тодд

Ответы [ 3 ]

2 голосов
/ 14 ноября 2010

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 компилятора, чтобы создать объект без какого-либо встраивания имени какой-либо библиотеки. Это предназначено (главным образом) для создания статических библиотек, поэтому они не будут встраивать имя библиотеки, с которой конфликтуют, как бы вы ни создавали код, который использует вашу библиотеку.

1 голос
/ 14 ноября 2010

libc.lib больше не используется.

Параметры статического или динамического включения библиотеки времени выполнения C (CRT) в VC ++ 10 документированы здесь .Вы можете выбрать тот, который вам нужен / желаемый в параметрах проекта.

0 голосов
/ 14 ноября 2010

printf (фактически fprintf to stdout), а также другие «стандартные» функции malloc, exit и т. Д. Статически связаны с libc.lib, поэтому вы нигде не видите его как dll.

...