Freigeben über


Probleme bei Inlinefunktionen

Wenn Sie die Funktionslinierung verwenden, müssen Sie Folgendes ausführen:

  • Lassen Sie die Inlinefunktionen in der Headerdatei implementiert, die Sie einschließen.

  • Haben Sie die Einfügefunktion in der Headerdatei aktiviert.

// LNK2019_function_inline.cpp
// compile with: /c
// post-build command: lib LNK2019_function_inline.obj
#include <stdio.h>
struct _load_config_used {
   void Test();
   void Test2() { printf("in Test2\n"); }
};

void _load_config_used::Test() { printf("in Test\n"); }

und anschließend

// LNK2019_function_inline_2.cpp
// compile with: LNK2019_function_inline.lib
struct _load_config_used {
   void Test();
   void Test2();
};

int main() {
   _load_config_used x;
   x.Test();
   x.Test2();   // LNK2019
}

Wenn Sie die #pragma inline_depth Compilerdirektive verwenden, stellen Sie sicher, dass Sie über einen Wert von 2 oder höher verfügen. Ein Wert von Null deaktiviert das Inlining. Stellen Sie außerdem sicher, dass Sie die Compileroptionen "/Ob1 " oder "/Ob2 " verwenden.

Das Mischen von Inline- und Nicht-Inlinekompilierungsoptionen auf verschiedenen Modulen kann manchmal Zu Problemen führen. Wenn eine C++-Bibliothek mit aktivierter Funktion (/Ob1 oder /Ob2) erstellt wird, aber die entsprechende Headerdatei, die die Funktionen beschreibt, deaktiviert ist (keine Option), erhalten Sie einen Fehler LNK2001. Die Funktionen werden nicht in den Code aus der Headerdatei eingebunden, aber da sie sich nicht in der Bibliotheksdatei befinden, gibt es keine Adresse, um den Verweis aufzulösen.

Ebenso wird ein Projekt, das funktionsinlining verwendet, die Funktionen in einer CPP-Datei und nicht in der Headerdatei definiert, auch LNK2019. Die Headerdatei wird überall als angemessen angegeben, aber die Funktionen werden nur inlineiert, wenn die CPP-Datei den Compiler durchläuft; Daher sieht der Linker die Funktionen als ungelöste Externe, wenn er in anderen Modulen verwendet wird.

// LNK2019_FIP.h
struct testclass {
   void PublicStatMemFunc1(void);
};

Und dann

// LNK2019_FIP.cpp
// compile with: /c
#include "LNK2019_FIP.h"
inline void testclass::PublicStatMemFunc1(void) {}

Und dann

// LNK2019_FIP_2.cpp
// compile with: LNK2019_FIP.cpp
// LNK2019 expected
#include "LNK2019_FIP.h"
int main() {
   testclass testclsObject;

   // module cannot see the implementation of PublicStatMemFunc1
   testclsObject.PublicStatMemFunc1();
}

Siehe auch

Linkertoolfehler LNK2019