// unit_tests.cpp
#include "unit_tests.hpp"
#include <cassert>
void tests::number::test() {
using math::Number;
{
assert(Number("44").precision() == 0 && "false precision_ ");
assert(Number(-14e+2, 7).precision() == 7 && "false precision_");
auto a{ Number(44e-1, 85) };
auto b{ a }; // checks the copy-constructor
assert(b.precision() == 85 && "false precision_");
}
}
Si j'appelle tests::number::test() dans le main, j'ai cette erreur
LNK2019 unresolved external symbol "public: unsigned short & __thiscall math::Number::precision(void)" (?precision@Number@math@@QAEAAGXZ) referenced in function "void __cdecl tests::number::test(void)" (?test@number@tests@@YAXXZ) MathLib E:\C++\Projets\MathLib\unit_tests.obj 1
Je crois savoir qu'un unresolved eternal symbol signifie que le compilateur a trouvé la déclaration, mais pas l'implémentation / initialisation d'une variable ou d'une fonction.
Si je réunis ça en un seul fichier, ça s'exécute parfaitement.
Comment puis-je m'y prendre pour résoudre ce problème ?
Merci d'avance.
EDIT : j'ai remarqué dans l'erreur que les conventions d'appel (j'ai regardé ici, ça a l'air d'être des trucs pour le compilo en assembleur) sont différentes (__thiscall / __cdecl), j'ai donc essayé d'ajouter __cdecl à la signature de la fonction incriminée (prototype + implémentation), mais le message d'erreur est le même (sauf que __thiscall est remplacé par __cdecl).
@bacelar excusez-moi, je pensais que ça suffisait pour répondre, du coup j'ai vérifié dans les paramètres du fichier avec VS et il est bien inclus dans la compilation
Il manque le supposé namespace math dans number.hpp, mais bon je suppose qu'il y est dans le fichier originel. Non la raison probable vient des inline dans le fichier number.cpp
@Spaceln c'était bien le inline qui posait problème, je l'ai enlevé et ça linke correctement.
Après de nouvelles recherches, ce lien indique que les implémentations inline doivent être dans le header (c'est vrai qu'en fin de compte c'est logique puisque l'éditeur de liens remplace l'appel par leur corps).
Merci pour votre aide (j'aurais du faire davantage de recherches avant de poster, veuillez m'excuser)
C'est étrange que le compilateur vous est suivi dans cet inline "sauvage" dans un .cpp (inline n'est qu'indicatif) et encore plus qu'il n'ait pas sorti au moins un warning.
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Vous devriez essayer de garder le niveau de warning au maximum, quit à faire des #pragma push/pop autour des #include de headers C. (headers que vous devriez éviter quand c'est possible)
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Bien entendu, je ne m'en sers pas au sens C (math.h), mais certaines fois (cmath, cassert voire une fois ou deux cctype mais c'est tout).
Je suis allé faire un tour sur la doc de Microsoft, et d'après ce que j'ai compris, on peut appliquer un certain niveau d'avertissement pour une partie de code donnée, selon SO :
#pragma warning(push, 0)
// niveau de warnings à 0
#include <headerWithWarnings>
// warnings non émis
#pragma warning(pop)
// niveau de warnings remis à la valeur des paramètres
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Liens utiles pour le C++
Liens utiles pour le C++
Liens utiles pour le C++
Liens utiles pour le C++
Liens utiles pour le C++
Liens utiles pour le C++
Liens utiles pour le C++