私は、可能な限り最小のバイナリを生成しようとする課題の 1 つに関与しているため、C または C++ ランタイム ライブラリ (RTL)を使用せずにプログラムをビルドしています。DLL バージョンまたは静的バージョンにはリンクしません。#include
ヘッダーファイルさえありません。私はこれでうまくいきました。
などの一部の RTL 関数はmemset()
便利なので、独自の実装を追加してみました。デバッグ ビルドでは正常に動作します (コンパイラが への暗黙的な呼び出しを生成する場所でもmemset()
)。しかし、リリース ビルドでは、組み込み関数を定義できないというエラーが表示されます。リリース ビルドでは、組み込み関数が有効になっておりmemset()
、組み込み関数です。
組み込みの for をリリース ビルドで使用したいと考えてmemset()
います。これはおそらくインライン化されており、私の実装よりも小さくて高速だからです。しかし、私はキャッチ22のようです。を定義しないmemset()
と、リンカーはそれが未定義であると不平を言います。定義すると、コンパイラは、組み込み関数を定義できないと文句を言います。
#pragma
RTL オーバーヘッドを引き込まずに組み込み関数を取得するための定義、宣言、およびコンパイラとリンカー フラグの正しい組み合わせを知っている人はいますか?
Visual Studio 2008、x86、Windows XP+。
問題をもう少し具体的にするには:
extern "C" void * __cdecl memset(void *, int, size_t);
#ifdef IMPLEMENT_MEMSET
void * __cdecl memset(void *pTarget, int value, size_t cbTarget) {
char *p = reinterpret_cast<char *>(pTarget);
while (cbTarget > 0) {
*p++ = static_cast<char>(value);
--cbTarget;
}
return pTarget;
}
#endif
struct MyStruct {
int foo[10];
int bar;
};
int main() {
MyStruct blah;
memset(&blah, 0, sizeof(blah));
return blah.bar;
}
そして、私は次のように構築します:
cl /c /W4 /WX /GL /Ob2 /Oi /Oy /Gs- /GF /Gy intrinsic.cpp
link /SUBSYSTEM:CONSOLE /LTCG /DEBUG /NODEFAULTLIB /ENTRY:main intrinsic.obj
の実装でコンパイルすると、コンパイルmemset()
エラーが発生します。
error C2169: 'memset' : intrinsic function, cannot be defined
の実装なしでこれをコンパイルするとmemset()
、リンカ エラーが発生します。
error LNK2001: unresolved external symbol _memset