Problemy ze śródwierszowaniem funkcji

Jeśli używasz tworzenia inliningu funkcji, musisz:

  • Mają wbudowane funkcje zaimplementowane w pliku nagłówkowym, który został uwzględniony.

  • W pliku nagłówka włączono wciśnięcie.

// 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"); }

A następnie,

// 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
}

Jeśli używasz dyrektywy kompilatora #pragma inline_depth , upewnij się, że masz wartość 2 lub większą. Wartość zero spowoduje wyłączenie podkreślenia. Upewnij się również, że używasz /Ob1 lub /Ob2 opcji kompilatora.

Mieszanie wbudowanych i nieliniowych opcji kompilacji w różnych modułach może czasami powodować problemy. Jeśli biblioteka języka C++ jest tworzona z włączonym tworzeniem funkcji (/Ob1 lub /Ob2), ale odpowiedni plik nagłówkowy opisujący funkcje jest wyłączony (bez opcji), zostanie wyświetlony błąd LNK2001. Funkcje nie są wstawiane do kodu z pliku nagłówka, ale ponieważ nie znajdują się w pliku biblioteki, nie ma adresu do rozpoznania odwołania.

Podobnie projekt, który używa inlining funkcji, ale definiuje funkcje w pliku cpp, a nie w pliku nagłówkowym, również otrzyma LNK2019. Plik nagłówka jest dołączany wszędzie, co jest uważane za odpowiednie, ale funkcje są wciśnięty tylko wtedy, gdy plik cpp przechodzi przez kompilator; Dlatego konsolidator postrzega funkcje jako nierozwiązane zewnętrzne, gdy są używane w innych modułach.

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

a następnie,

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

a następnie,

// 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();
}

Zobacz też

Błąd narzędzi konsolidatora LNK2019