[C++] Błąd LNK2019 podczas przerabiania kodu 7447 17

O temacie

Autor Drock

Zaczęty 18.03.2018 roku

Wyświetleń 7447

Odpowiedzi 17

Drock

Drock

Użytkownicy
posty357
Propsy75
ProfesjaProgramista
  • Użytkownicy
Cześć,
Od kilku dni przerabiam kodu żeby wyodrębnić z niego klasy, i męczę się ostatnio z błędem LNK 2019....
Wcześniej go nie spotkałem :( ktoś wie jak go naprawić? Używam visual studio 2017

1>FApplication.obj : error LNK2019: unresolved external symbol "public: void __cdecl FCamera::Initialize(int,int,struct DirectX::__vector4,struct DirectX::__vector4,struct DirectX::__vector4)" (?Initialize@FCamera@@QEAAXHHU__vector4@DirectX@@00@Z) referenced in function "private: bool __cdecl FApplication::InitScene(void)" (?InitScene@FApplication@@AEAA_NXZ)
1>FApplication.obj : error LNK2019: unresolved external symbol "public: void __cdecl FCamera::UpdateCamera(struct DirectX::__vector4)" (?UpdateCamera@FCamera@@QEAAXU__vector4@DirectX@@@Z) referenced in function "private: void __cdecl FApplication::DetectInput(double)" (?DetectInput@FApplication@@AEAAXN@Z)
1>FApplication.obj : error LNK2019: unresolved external symbol "public: void __cdecl FCamera::SetParameters(float,float,struct DirectX::__vector4,struct DirectX::__vector4)" (?SetParameters@FCamera@@QEAAXMMU__vector4@DirectX@@0@Z) referenced in function "private: void __cdecl FApplication::DetectInput(double)" (?DetectInput@FApplication@@AEAAXN@Z)
1>FApplication.obj : error LNK2019: unresolved external symbol "public: struct DirectX::__vector4 __cdecl FCamera::GetPosition(void)" (?GetPosition@FCamera@@QEAA?AU__vector4@DirectX@@XZ) referenced in function "private: void __cdecl FApplication::UpdateScene(double)" (?UpdateScene@FApplication@@AEAAXN@Z)
1>FApplication.obj : error LNK2019: unresolved external symbol "public: struct DirectX::__vector4 __cdecl FCamera::GetRight(void)" (?GetRight@FCamera@@QEAA?AU__vector4@DirectX@@XZ) referenced in function "private: void __cdecl FApplication::DetectInput(double)" (?DetectInput@FApplication@@AEAAXN@Z)
1>FApplication.obj : error LNK2019: unresolved external symbol "public: struct DirectX::__vector4 __cdecl FCamera::GetForward(void)" (?GetForward@FCamera@@QEAA?AU__vector4@DirectX@@XZ) referenced in function "private: void __cdecl FApplication::DetectInput(double)" (?DetectInput@FApplication@@AEAAXN@Z)
1>C:\Users\batzi\source\repos\FEngine\x64\Debug\FEngine.exe : fatal error LNK1120: 6 unresolved externals

Kod klasy:
#pragma once
 
#include <DirectXMath.h>
 
using namespace DirectX;
 
class FCamera
{
public:
    FCamera();
    ~FCamera();
 
    void Initialize(int, int, XMVECTOR, XMVECTOR, XMVECTOR);
    void UpdateCamera(XMVECTOR);
 
    void SetParameters(float, float, XMVECTOR, XMVECTOR);
 
    XMVECTOR GetPosition();
    XMVECTOR GetRight();
    XMVECTOR GetForward();
 
    const XMMATRIX GetView();
    const XMMATRIX GetProjection();
 
    float GetYaw();
    float GetPitch();
private:
    const float mCharCamDist = 15.0f; //Distance between character and camera.
 
    float mYaw;
    float mPitch;
 
    //Matrices.
    XMMATRIX mView;
    XMMATRIX mProjection;
    XMMATRIX mRotationMatrix;
 
    //Vectors.
    XMVECTOR mPosition;
    XMVECTOR mTarget;
    XMVECTOR mUp;
    XMVECTOR mForward;
    XMVECTOR mRight;
 
    XMVECTOR mDefaultForward;
    XMVECTOR mDefaultRight;
};

wszystkie funkcje mam zdefiniowane w innym pliku
 

neko

neko

Użytkownicy
BE CURIOUS!
posty20
Propsy11
ProfesjaProgramista
  • Użytkownicy
  • BE CURIOUS!
Błąd linkera, podeślij plik z implementacją tej klasy.
 

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer
Jak kolega wyżej napisał..
gdzieś nie masz zalinkowanej libki
 

neko

neko

Użytkownicy
BE CURIOUS!
posty20
Propsy11
ProfesjaProgramista
  • Użytkownicy
  • BE CURIOUS!
Ewentualnie jak tworzysz gdzieś obiekty tej klasy to podeślij też fragment kodu w którym wywołujesz konstruktor.
 

Drock

Drock

Użytkownicy
posty357
Propsy75
ProfesjaProgramista
  • Użytkownicy
To jest definicja tej klasy
#include "FCamera.h"
 
FCamera::FCamera()
{
    mYaw = 0.0f;
    mPitch = 0.0f;
 
    mDefaultForward = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f);
    mDefaultRight = XMVectorSet(1.0f, 0.0f, 0.0f, 0.0f);
 
    mForward = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f);
    mRight = XMVectorSet(1.0f, 0.0f, 0.0f, 0.0f);
}
 
FCamera::~FCamera()
{
}
 
void FCamera::Initialize(int width, int height, XMVECTOR camPosition, XMVECTOR camTarget, XMVECTOR camUp)
{
    mView = XMMatrixLookAtLH(mPosition, mTarget, mUp);
    mProjection = XMMatrixPerspectiveFovLH(3.14f / 4.0f, (float)width / height, 1.0f, 200.0f);
}
 
void FCamera::UpdateCamera(XMVECTOR charPosition)
{
    // Set the camera target at character.
    mTarget = charPosition;
 
    mTarget = XMVectorSetY(mTarget, XMVectorGetY(mTarget) + 5.0f);
 
    // Rotate camera around target
    mRotationMatrix = XMMatrixRotationRollPitchYaw(-mPitch, mYaw, 0);
    mPosition = XMVector3TransformNormal(mDefaultForward, mRotationMatrix);
    mPosition = XMVector3Normalize(mPosition);
 
    // Set our cameras position to rotate around the character.
    mPosition = (mPosition * mCharCamDist) + mTarget;
 
    mForward = XMVector3Normalize(mTarget - mPosition);
    mForward = XMVectorSetY(mForward, 0.0f);   
 
    mForward = XMVector3Normalize(mForward);
 
    mRight = XMVectorSet(-XMVectorGetZ(mForward), 0.0f, XMVectorGetX(mForward), 0.0f);
 
    mUp = XMVector3Normalize(XMVector3Cross(XMVector3Normalize(mPosition - mTarget), mRight));
 
    mView = XMMatrixLookAtLH(mPosition, mTarget, mUp);
}
 
void FCamera::SetParameters(float camYaw, float camPitch, XMVECTOR camRight, XMVECTOR camForward)
{
    mYaw = camYaw;
    mPitch = camPitch;
    mRight = camRight;
    mForward = camForward;
}
 
XMVECTOR FCamera::GetPosition()
{
    return mPosition;
}
 
XMVECTOR FCamera::GetRight()
{
    return mRight;
}
 
XMVECTOR FCamera::GetForward()
{
    return mForward;
}
 
const XMMATRIX FCamera::GetView()
{
    return mView;
}
 
const XMMATRIX FCamera::GetProjection()
{
    return mProjection;
}
 
float FCamera::GetYaw()
{
    return mYaw;
}
 
float FCamera::GetPitch()
{
    return mPitch;
}

Narazie nie mam dostępu do pliku w którym wywołuje podeślę jak wrócę do domu
 

neko

neko

Użytkownicy
BE CURIOUS!
posty20
Propsy11
ProfesjaProgramista
  • Użytkownicy
  • BE CURIOUS!
Hmm, to może w samej strukturze projektu visual studio jest coś nie tak, właśnie dlatego jestem fanem samemu pisania buildów w cmake'u :D
 

Drock

Drock

Użytkownicy
posty357
Propsy75
ProfesjaProgramista
  • Użytkownicy
A jest sposób żeby to jakoś sprawdzić?
lub kazać visualowi to ogarnąć?

moze kiedyś się nauczę i też będę pisał sam :P
 

neko

neko

Użytkownicy
BE CURIOUS!
posty20
Propsy11
ProfesjaProgramista
  • Użytkownicy
  • BE CURIOUS!
A nie mam pojęcia, używam visuala tylko tyle co muszę na laborkach, a budowałeś wcześniej ten projekt bez błędów czy od razu coś nie trybiło?
 

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer
Dawno nie używałem visuala, ale sprawdź czy poprawnie linkujesz libkę directa do swojego projektu. Linkujesz plik hpp, ale nie widzi skąd pobrać definicje funkcji.
Jest to linkowanie statyczne.
Spróbuj zmienić na dynamiczne i skompiluj api diecta do libki dll.
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Mi się wydaje, że problem jest taki, że to FCamera gdzieś nie widać, a nie że FCamera nie widzi czegoś z DXa. Errory raczej na to wskazują.

Czy masz wszystko w jednym projekcie, czy porozbijane na kilka projektów w jednej solucji?


A poza tym, to miło widzieć, że ktoś inny też się zajmuje pisaniem silnika.
 
Popisuje się ciągle menda jedna...

neko

neko

Użytkownicy
BE CURIOUS!
posty20
Propsy11
ProfesjaProgramista
  • Użytkownicy
  • BE CURIOUS!
Raczej na bank to prototyp klasy nie widzi implementacji metod, imo linkowanie directx'a tutaj nie ma nic na rzeczy.
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
no przecież właśnie to powiedziałem.
 
Popisuje się ciągle menda jedna...

neko

neko

Użytkownicy
BE CURIOUS!
posty20
Propsy11
ProfesjaProgramista
  • Użytkownicy
  • BE CURIOUS!
powiedziałeś, że ci się wydaje, a ja wyraziłem aprobatę, o co się czepiasz? xd
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
A, to wybacz. Nie zrozumieliśmy się :D
 
Popisuje się ciągle menda jedna...

Drock

Drock

Użytkownicy
posty357
Propsy75
ProfesjaProgramista
  • Użytkownicy
1. Tak wcześniej trybiło, przestało trybić jak z FApplication wyciąłem jedną funkcję i kilka zmiennych i zrobiłem z nich klasę FCanera. Jak wcześniej tak robiłem to bez takich problemów.
2. Wszystko mam w jednym projekcie
 

neko

neko

Użytkownicy
BE CURIOUS!
posty20
Propsy11
ProfesjaProgramista
  • Użytkownicy
  • BE CURIOUS!
Okej, czyli gdzieś tworzysz obiekt FCamera? Pokaż jak to robisz.
 

Drock

Drock

Użytkownicy
posty357
Propsy75
ProfesjaProgramista
  • Użytkownicy
Pozwolę sobie dać fragmenty bo kod trochę długi.....

W klasie...
....
private:
FInput * mInput;
FTimer* mTimer;
FCamera* mCamera;
....

Inicjalizacja
mCamera = new FCamera;
if (!mCamera)
{
return false;
}

Usunięcie obiektu
if (mCamera)
{
delete mCamera;
mCamera = 0;
}


I jak mam tylko to co powyżej to przechodzi bez błędów.....

jak dam wywołanie jakiejś funkcji np.
camPosition = XMVectorSet(0.0f, 10.0f, 8.0f, 0.0f);
camTarget = XMVectorSet(0.0f, 3.0f, 0.0f, 0.0f);
camUp = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);

mCamera->Initialize(Width, Height, camPosition, camTarget, camUp);


To zaczyna krzaczyć już
 

neko

neko

Użytkownicy
BE CURIOUS!
posty20
Propsy11
ProfesjaProgramista
  • Użytkownicy
  • BE CURIOUS!
Wszystko okej wygląda, no to chyba jedyna opcja jest taka, że linker nie linkuje FCamera.o.
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry