0

次のコードがあります。

#include <stdio.h>

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

Windows 7 x86 で MSVC++ 10.0 を使用して、次のようにコマンド ラインでコンパイルします。

cl.exe simple.cpp

これにより simple.exe が生成され (コンパイラは自動的にリンカーを呼び出します)、実行可能ファイルは期待どおりに "hello world" メッセージを表示します。depends.exe を使用して実行可能ファイルを調べると、kernel32.dll が唯一の依存関係として表示されます。kernel32.dll ライブラリのコンテンツをダンプすると、printf が表示されません。

VC++ はある種の最適化を採用しているので、printf は最終的な実行可能ファイルに何らかの方法で直接含まれていますか? もしそうなら、どのように、そしてそれはどこかに文書化されていますか?

4

3 に答える 3

2

MS VC は、ほとんどのオブジェクト ファイルに「デフォルト」ライブラリの名前を埋め込みます。-nodefaultlibリンカーのオプションで特に指定しない限り、そのライブラリ (またはそれらのライブラリ) がリンクされます。それを単独で使用すると、デフォルトのライブラリはリンクされませんまたは、 のような特定のライブラリを指定することもできます。この場合、ここで指定したものを除く-nodefaultlib:mylib.libすべてのデフォルト ライブラリがリンクされます。

あなたの例を使用するには、次を使用する場合:

cl simple.c

正しくコンパイルおよびリンクされます。ただし、次を使用する場合:

cl simple.c -link -nodefaultlib

あなたは得るでしょう:

simple.obj : エラー LNK2019: 関数 main
LINK で参照されている未解決の外部シンボル printf : エラー LNK2001: 未解決の外部シンボル mainCRTStartup
simple.exe : 致命的なエラー LNK1120: 2 つの未解決の外部

完全にするために、コンパイラの/Zlスイッチを使用して、ライブラリの名前を埋め込まずにオブジェクトを作成することもできます。これは(主に)静的ライブラリを作成することを目的としているため、ライブラリを使用するコードをビルドしても競合する可能性のあるライブラリの名前が埋め込まれません。

于 2010-11-14T17:55:19.977 に答える
1

libc.libは使用されなくなりました。

VC++ 10 に C ランタイム ライブラリ (CRT) を静的または動的に含めるためのオプションについては、こちらに記載されています。プロジェクトオプションで必要/希望するものを選択できます。

于 2010-11-14T15:45:11.520 に答える
0

printf (実際には fprintf から stdout へ)、およびその他の「標準」関数 malloc、exit などは libc.lib と静的にリンクされているため、どこにも dll として表示されません。

于 2010-11-14T15:43:02.103 に答える