Problèmes de fonctions inline
Si vous utilisez l’incorporation de fonctions, vous devez :
Ayez les fonctions inline implémentées dans le fichier d’en-tête que vous incluez.
L’incorporation est activée dans le fichier d’en-tête.
// 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"); }
Enfin,
// 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
}
Si vous utilisez la directive du #pragma inline_depth
compilateur, vérifiez que vous disposez d’une valeur de 2 ou d’un ensemble supérieur. Une valeur de zéro désactive l’inlining. Vérifiez également que vous utilisez les options du compilateur /Ob1 ou /Ob2 .
La combinaison d’options de compilation inline et non inline sur différents modules peut parfois entraîner des problèmes. Si une bibliothèque C++ est créée avec l’inlining de fonction activée (/Ob1 ou /Ob2), mais que le fichier d’en-tête correspondant décrivant les fonctions a désactivé (aucune option), vous obtiendrez une erreur LNK2001. Les fonctions ne sont pas insérées dans le code du fichier d’en-tête, mais, étant donné qu’elles ne figurent pas dans le fichier de bibliothèque, il n’existe aucune adresse pour résoudre la référence.
De même, un projet qui utilise l’incorporation de fonctions mais définit les fonctions dans un fichier .cpp plutôt que dans le fichier d’en-tête obtiendra également LNK2019. Le fichier d’en-tête est inclus partout où il est jugé approprié, mais les fonctions ne sont insérées que lorsque le fichier .cpp passe par le compilateur ; par conséquent, l’éditeur de liens voit les fonctions comme des externes non résolus lorsqu’elles sont utilisées dans d’autres modules.
// LNK2019_FIP.h
struct testclass {
void PublicStatMemFunc1(void);
};
Et puis
// LNK2019_FIP.cpp
// compile with: /c
#include "LNK2019_FIP.h"
inline void testclass::PublicStatMemFunc1(void) {}
Et puis
// 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();
}