Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
ajutor

Whisky for Mac

Xiaomi 14 Gpay

Izolare zid exterior de scandura
 Dezinstalare drivere W11 23H3

Recomandare masina de spalat fiab...

BSOD din cauza Intel Audio DSP dr...

De ce sunt oamenii nostalgici
 Cum vand casa fara factura Hidroe...

Scor FICO minim

Tonometru compensat CAS?

polita RCA ONLINE
 Termostat frigider - verificare

Mai au PC-urile vreun viitor?

Centrala termica immergas

Amenda in Lipsa ?
 

Linking error (Lnk2019)

- - - - -
  • Please log in to reply
9 replies to this topic

#1
TheOriginals

TheOriginals

    Junior Member

  • Grup: Members
  • Posts: 51
  • Înscris: 30.05.2016
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()Posted Image. 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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,232
  • Înscris: 24.02.2007
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
TheOriginals

TheOriginals

    Junior Member

  • Grup: Members
  • Posts: 51
  • Înscris: 30.05.2016
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.


#4
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,232
  • Înscris: 24.02.2007
Implementarea lui staticMethod unde e?

#5
TheOriginals

TheOriginals

    Junior Member

  • Grup: Members
  • Posts: 51
  • Înscris: 30.05.2016
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
TheOriginals

TheOriginals

    Junior Member

  • Grup: Members
  • Posts: 51
  • Înscris: 30.05.2016
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 B)
{
  return a + b;
}
double MathOperations::Multiply(double a, double B)
{
  return a * b;
}
double MathOperations::Substract(double a, double B)
{
  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?

#7
Cy_Cristian

Cy_Cristian

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 22.02.2009
clasa external nu este exportata.

#8
TheOriginals

TheOriginals

    Junior Member

  • Grup: Members
  • Posts: 51
  • Înscris: 30.05.2016

 Cy_Cristian, on 23 februarie 2018 - 13:21, said:

clasa external nu este exportata.
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?)
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
Cy_Cristian

Cy_Cristian

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 22.02.2009

 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?)
Cand exporti o clasa, exporti toata interfata ei. Asadar, tot ce tine de acest lucru trebuie sa fie disponibil intr-o biblioteca (sau mai multe). De exemplu daca o metoda returneaza un obiect din biblioteca boost, nu este datoria clasei tale sa exporte acea clasa, ci ea va fi exportata de una din bibliotecile oferite de boost.
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
TheOriginals

TheOriginals

    Junior Member

  • Grup: Members
  • Posts: 51
  • Înscris: 30.05.2016
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

Chirurgia spinală minim invazivă 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

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate