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ż
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla