Chirurgia spinală minim invazivă
Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical. Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale. www.neurohope.ro |
Linking error (Lnk2019)
Last Updated: Feb 23 2018 17:28, Started by
TheOriginals
, Feb 22 2018 11:21
·
0
#1
Posted 22 February 2018 - 11:21
Salut,
Ma confrut cu o problema care ma "bate". Scenariul este cam asa. Am o clasa unde am o metoda statica (e.g: static void hello(). Metoda asta este invocata dintr-o alta clasa si functioneaza ok (deci nu sunt probeleme de definire, header, definirea metodei fara specificarea clasei, samd. merge). Problema apare atunci cand invoc metoda statica dintr-o clasa care importa dintru-un dll si are niste metode virtuale. class _declspec(dllimport) BaseClass{ virtual void printMsg(); } Apoi vine clasa in care apelez (dev.h) class dev: public BaseClass { void printMsg()override; } In dev.cpp fac ceva de genul #include"dev.h" void dev::printMsg() { staticClass::staticMethod();// LNK 2019 error } Si clasa static nu e nimic iesit din comun. class staticClass { static void staticMethod(); } Dupa cum am mentionat si mai sus daca e apelata din alte clase functioneaza doar aici imi da eroare la linkare. Daca adaug methoda mea direct in clasa derivata functioneaza fie ca e statica sau methoda ("normala") numai cea invocata din alta clasa nu vrea. Imi sta problema asta ca un pitic pe creier, poate imi da cineva un hint. Multumesc. Edited by TheOriginals, 22 February 2018 - 11:29. |
#2
Posted 22 February 2018 - 18:32
Fa un desen pe scurt unde sa se vada ce clase in ce parte sunt implementate (dll/executabil) si compilarea carei aplicatii/biblioteci duce la LNK 2019.
|
#3
Posted 22 February 2018 - 21:25
Scuze, dar nu prea m-am prins cum ar trebui sa arate desenul. In problema pe care o am acum am mai multe clase insa am incercat sa simplific model si am facut rost de aceiasi eroare.
class staticClass{ public: static void staticMethod(); }; class _declspec(dllimport) BaseClass { public: virtual void printMsg(); }; class dev : public BaseClass { public: void printMsg()override; }; void dev::printMsg() { staticClass::staticMethod();// LNK 2019 error }; int main() { dev d; d.printMsg(); } Eroare zice ca nu stie de metoda statica (am verificat si tipul call-ului (cdecl, fastcall samd ) si din punctul asta de vedere e ok); Edited by TheOriginals, 22 February 2018 - 21:25. |
#5
Posted 22 February 2018 - 22:12
Fiecare clasa are fisiere separate(am incercat sa simplific aici ca sa fie mai usor de urmarit). Implementarea pentru staticMethod e in staticClass.h
|
#6
Posted 23 February 2018 - 11:20
Nu vreau ca experianta mea de lucru cu dll-uri sa te chinuie asa ca am mai facut un exemplu mai clar care imi da aceiasi eroare:
#pragma once #ifdef MATH_EXPORT #define MATH_LIB_API __declspec(dllexport) #else #define MATH_LIB_API __declspec(dllimport) #endif #include<iostream> namespace math { class MATH_LIB_API MathOperations { public: static double Add(double op1, double op2); static double Multiply(double op1, double op2); static double Substract(double op1, double op2); }; class MATH_LIB_API staticTest { public: static void test(); }; class external { public: static void secTest(); }; } Iar in main #include<iostream> #include"../MathDLL/MathLib.h" #include"../ClassDllExport/MathOperations.h" using namespace std; int main() { cout << MathLibrary::MathLib::Add(2, 3) << endl; cout << "class export : " << math::MathOperations::Multiply(2, 3) << endl; cout << "class export : "; math::staticTest::test(); //daca invoc metoda asta singura de aici imi da eroare math::external::secTest(); return 0; } .cpp ar arata cam asa (definitii simple) namespace math { double MathOperations::Add(double a, double { return a + b; } double MathOperations::Multiply(double a, double { return a * b; } double MathOperations::Substract(double a, double { return a - b; } void staticTest::test() { std::cout << "Hello from dll."; } void external::secTest() { std::cout << "test insde class outside dll"; } } Cum am scris si in cmm daca invoc external::secTest() in main zice: Error LNK2019 unresolved external symbol "public: static void __cdecl math::external::secTest(void)" (?secTest@external@math@@SAXXZ) referenced in function _main AppDllImport Error LNK1120 1 unresolved externals AppDllImport E:\testProjects\AppDllImport\Debug\AppDllImport.exe 1 Deci ideea e ca intr-un fisier fie export toate clasele fie niciuna? |
#8
Posted 23 February 2018 - 14:03
Cy_Cristian, on 23 februarie 2018 - 13:21, said:
clasa external nu este exportata. Totusi inca am am probleme, daca incerc sa fac ceva de genul asta (1 metoda virtuala si atat..). Daca nu mai derivez clasa de baza functioneaza ok.
Spoiler
Iar in main
Spoiler
Am mai urmarit un exemplu pe stackoverflow care exporta doar o instanta a clasei, iar daca o folosesc asa functioneaza. Daca renunt la ultima metoda ce face exportul si adaug __declspec(dllexport) la fiecare clasa din nou nu functioneaza.
Spoiler
|
#9
Posted 23 February 2018 - 15:05
Thefake_fake_fake, on 23 februarie 2018 - 14:03, said:
Da, asa este (dupa ce am mai citit mi-am dat seama ca abolut tot ce foloseste o clasa exportata trebuie sa fie la randul sau exportat, e adevarat nu?) Atentie, clasele interne nu sunt exportate automat. Pe de alta parte, nimic din ceea ce se foloseste in implementarea unei clase nu trebuie exportat, de aceea nici nu e nevoie sa fie exportata clasa SDLConsole, pentru ca nu apare in interfata. Ea apare doar in implementare. PS: N-am inteles ce merge si ce nu merge la exemplul cu operatii matematice. Edited by Cy_Cristian, 23 February 2018 - 15:08. |
#10
Posted 23 February 2018 - 17:28
La exemplul cu operatii artitemetice functioneaza numai daca sterg derivarea din base sau daca sterg virtual din clasa de baza...Daca o las asa cum e prezentata mai sus da eroarea de link-editare. Si sincer nu prea inteleg de ce vrea sa ma chinuie asa ).
Deci in conculzie daca sterg cuvantul virtual din clasa de baza sau daca nu mai derivez base functioneaza, daca fac oricare din cele 2 actiuni din cele mentionate nu mai functioneaza. |
|
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users