2010-01-29 6 views
0

Я пишу привет-мирное приложение C++, в инструкции #include помогите компилятору или компоновщику импортировать библиотеку C++. Мой "cout < <" hello world ";" используйте cout в библиотеке. Вопрос заключается в том, что после компиляции и генерации exe имеет размер около 96k, поэтому какие инструкции действительно содержатся в этом exe-файле, этот файл также содержит библиотеку iostream?статическая библиотека ссылок

Благодаря

+0

Какой компилятор? Какая операционная система? Какие параметры для компилятора и компоновщика? – bmargulies

+0

cl.exe/EHsc hello.cpp это компилятор vc. 96 Кбайт по-прежнему большой, считают, что у меня есть только два утверждения: cout << «привет»; return 0; – Stone

+1

Кто-то должен дать ему команду для дизассемблера на этой платформе. – Potatoswatter

ответ

0

Некоторые из пространства используется код запуска C++, а также части статической библиотеки, которые вы используете.

+1

Вы имеете в виду, что вся библиотека iostream объединена в сгенерированном exe? – Stone

+1

@stone, вообще говоря, компоновщик достаточно умен, чтобы включать только те части, которые фактически используются вашим кодом. – Trent

+0

Большинство компоновщиков, которые я видел (old-school UNIX), переходят только к уровню объектного файла в библиотеке (если этот объект удовлетворяет символу, весь объект входит). Но я думаю, что когда-то я прочитал, что MSVC (по крайней мере) может войти в объект и выйти из него, что ему нужно. Я не уверен. – paxdiablo

0

В Windows, библиотека или часть библиотек (которые используются) также обычно включаются в .exe, в случае с Linux этот случай отличается. Однако есть варианты оптимизации. Я думаю, эта ссылка на Wiki будет полезна: Static Libraries

2

cl /EHsc hello.cpp -link /MAP. Созданный файл .map даст вам общее представление о том, какие части статической библиотеки присутствуют в .exe.

4

В общем случае компоновщик будет использовать только то, что ему нужно. После того, как фанат превратил ваш исходный код в объектный файл, он обрабатывается почти так же, как и все другие объектные файлы. У вас есть:

  • пускового код C, который подготавливает среду исполнения (устанавливает ARGV, ARGV и так далее), а затем называют свой main или эквивалент.
  • ваш код сам.
  • любые объектные файлы необходимо перетаскивать из библиотек (динамическое связывание - это особый случай связывания, который происходит во время выполнения, и я не буду об этом рассказывать, так как вы специально задали вопрос о статической привязке).

Компонент будет содержать все объектные файлы, которые вы явно указываете (если только это не является особенно умным компоновщиком и может сказать, что вы не используете объектный файл).

С библиотеками это немного отличается. В принципе, вы начинаете со списка неразрешенных символов (например, cout). Компилятор будет искать все объектные файлы во всех указанных вами библиотеках, и, когда он найдет объектный файл, который удовлетворяет этому символу, он перетащит его и зафиксирует ссылки на символы.

Это может, конечно, добавить даже более неразрешенные символы, если, например, есть что-то в объектный файл, который зависит от функции C printf (маловероятно, но возможно).

Линкера продолжается так, пока все символы не будут удовлетворены (когда он предоставит вам исполняемый файл), или вы не можете быть удовлетворены (когда вы горько жалуетесь на ваши методы кодирования).

Что касается исполняемого файла, это может быть вся библиотека iostream, или она может быть минимальной, необходимой для выполнения заданий. Обычно это зависит от количества объектных файлов, в которые была встроена библиотека iostream.

Я видел код, в котором вся подсистема попала в один объектный файл, так что если вы хотите просто использовать один крошечный бит, у вас все еще есть партия. В качестве альтернативы вы можете поместить каждую отдельную функцию в свой собственный объектный файл, и компоновщик, вероятно, создаст исполняемый файл как можно меньше.

Есть варианты компоновщика, который может создать карту ссылок, которая покажет вам, как организованы вещи. Вероятно, вы, скорее всего, не увидите его, если используете IDE, но он будет глубоко погружен в диалоговые окна параметров компиляции в MSVC.

И, с точки зрения вашего добавленным комментарий, код:

cout << "hello"; 

будет вполне возможно привести в значительных кусков как iostream и код обработки строки.