2014-10-24 3 views
-2

Подходит, чтобы задать вопрос. Почему я получаю сообщение об ошибке с таким кодом?Как решить неопределенную ссылку на функцию FuzzyObject :: InitializeObj()?

FuzzyObject.h:

#ifndef FUZZYOBJECT_H 
#define FUZZYOBJECT_H 

#include <iostream> 
#include <d3d9.h> 
#include <d3dx9.h> 

class FuzzyObject { 
public: 
    FuzzyObject(); 
    typedef struct tagFMaterial* FMaterial; 
    typedef struct tagFMesh* FMesh; 
    typedef struct tagFuzzyForm { 
     D3DXVECTOR3 pos; 
     D3DXVECTOR3 rot; 
     D3DXVECTOR3 scale; 
     D3DXVECTOR3 forward; 
     D3DXVECTOR3 up; 
    } FuzzyForm; 

    typedef struct tagObject* Object; 

    typedef enum ObjectType { 
     FO_STATIC = 0, 
     FO_ANIM = 1, 
     FO_OBJ = 2, 
     FO_CAMERA = 3, 
     FO_LIGHT = 4 
    } Type; 

    typedef enum ObjectCollider { 
     BOX = 0, 
     SPHERE = 1, 
     MESH = 2 
    } Collider; 

    static FuzzyObject::Object InitializeObj(std::string ObjName, FuzzyObject::ObjectType type, bool render, FuzzyObject::FuzzyForm xform); 
    D3DXMATRIX UpdateTransform(FuzzyObject::FuzzyForm xform, FuzzyObject::Object camera); 
    void UpdateObject(Object); 
    ~FuzzyObject(); 
}; 
#endif 

FuzzyObject.cpp:

#include <d3d9.h> 
#include <d3dx9.h> 
#include <iostream> 
#include <FuzzyObject.h> 
#include <Personality.h> 
#include <GFX.h> 
#include <d3d9.h> 
#include <d3dx9.h> 

struct tagFMesh{ 
    LPD3DXMESH mesh; 
    LPD3DXBUFFER adjBuf; 
    LPD3DXBUFFER materialBuf; 
}; 

struct tagFMaterial { 
    LPD3DXEFFECT Shader; 
    LPDIRECT3DTEXTURE9 texture0, texture1, texture2; 
    LPDIRECT3DTEXTURE9 bump0, bump1, bump2; 
    D3DXVECTOR4 Color; 
    D3DXMATRIX MVP; 
}; 

struct tagObject { 
    std::string name; 
    FuzzyObject::Type type; 
    bool Physics; 
    FuzzyObject::Collider collider; 
    bool renderable; 
    FuzzyObject::FuzzyForm transform; 
    D3DXMATRIX FFMATRIX; 
    Personality::Behaviour CustomCode; 
    FuzzyObject::FMaterial materialDef; 
    FuzzyObject::FMesh mesh; 
}; 

D3DXMATRIX FuzzyObject::UpdateTransform (FuzzyObject::FuzzyForm xform, FuzzyObject::Object camera) { 
    D3DXMATRIX pos, rot, scale; 
    D3DXMATRIX M, V, P; 
    D3DXMATRIX MVP; 

    D3DXMatrixTranslation(&pos, 0.0f, 0.0f, 0.0f); 
    D3DXMatrixRotationYawPitchRoll(&rot, D3DXToRadian(xform.rot.x), D3DXToRadian(xform.rot.y), D3DXToRadian(xform.rot.z)); 
    D3DXMatrixScaling(&scale, xform.scale.x, xform.scale.y, xform.scale.z); 
    D3DXMatrixMultiply(&M, &scale, &rot); 
    D3DXMatrixMultiply(&M, &rot, &pos); 

    D3DXVECTOR3 from = D3DXVECTOR3(camera->transform.pos.x, camera->transform.pos.y, camera->transform.pos.z); 
    D3DXVECTOR3 to = D3DXVECTOR3(cos(camera->transform.rot.x*180/D3DX_PI), tan(camera->transform.rot.y*180/D3DX_PI), sin(camera->transform.rot.z*180/D3DX_PI)); 
    D3DXVECTOR3 up = D3DXVECTOR3(0.0f, 1.0f, 0.0f); 

    D3DXMatrixLookAtLH(&V, &from, &to, &up); 
    D3DXMatrixPerspectiveFovLH(&P, D3DXToRadian(60.0f), 640/480, 0.01, 1000); 

    MVP = M * V * P; 
    return MVP; 
} 

FuzzyObject::Object FuzzyObject::InitializeObj (std::string ObjName, FuzzyObject::ObjectType type, bool render, FuzzyObject::FuzzyForm xform) { 
    FuzzyObject::Object obj; 
    obj->transform = xform; 
    obj->name = ObjName; 
    obj->type = type; 
    obj->renderable = render; 
    return obj; 
} 

void FuzzyObject::UpdateObject(FuzzyObject::Object obj) { 
    obj->FFMATRIX = UpdateTransform(obj->transform, NULL); 
} 

Что происходит, я получаю эту ошибку в линкера:

Error: Undefined reference to 'FuzzyObject::InitializeObj()' 

из FuzzyGame.cpp , где звонок выполняется следующим образом:

FuzzyObject::Object obj = FuzzyObject::InitializeObj(/*my parameters g here*/); 

Любые идеи? Я не знаю, почему это это делает ... :(

+0

Сообщение об ошибке в вашем названии полностью отличается от сообщения об ошибке, указанного в вашем телеобъекте. Просьба уточнить, какую ошибку вы получаете. –

+0

О, стреляй! я случайно получил их неправильный путь ...: D – FuzzyQuills

+0

'' не является допустимым именем класса. Представьте свой реальный пример. –

ответ

0

Перевод блок, который вызывает function() потребности быть связаны с header.o. Скорее всего, это не указано в вашей системе сборки. Пожалуйста, произвести MCVE, это побуждает людей к помочь вам.

Вы должны настроить свой Dev-C++ проект признать FuzzyObject.h и FuzzyObject.cpp как зависимости FuzzyGame.cpp. Таким образом, сгенерированный Makefile будет содержать соответствующие инструкции сцепления, чтобы разрешить ссылку на FuzzyObject::InitializeObj().

Удачи вам в Half-Life 4, мы все с нетерпением ждем этого :).

+0

Не могли бы вы проверить выше, пожалуйста, так как я уже привязал свой фактический код. Возможно, это потому, что я использую Orwell Dev-C++? – FuzzyQuills

+0

Я не уверен, но он использует GCC 4.8.1, и я думаю, что mingw-make32 – FuzzyQuills

+0

Я вижу. Пожалуйста, разместите содержимое своего 'Makefile', чтобы мы могли вам помочь. –

0

Вот мои люди в make-файле. :)

# Project: FLDR-D3D9 
# Makefile created by Dev-C++ 5.7.1 

CPP  = g++.exe 
CC  = gcc.exe 
WINDRES = windres.exe 
RES  = FLDR-D3D9_private.res 
OBJ  = GFX.o FuzzyObject.o Personality.o Main.o FuzzyGame.o $(RES) 
LINKOBJ = GFX.o FuzzyObject.o Personality.o Main.o FuzzyGame.o $(RES) 
LIBS  = -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib32" -L"C:/Program Files (x86)/Dev- Cpp/MinGW64/x86_64-w64-mingw32/lib32" -static-libgcc -mwindows ../../../../Dev-Cpp/lib/libd3d9.a ../../../../Dev-Cpp/lib/libd3dx9.a ../../../../Dev-Cpp/lib/libpthreadGC2.a -m32 
INCS  = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.8.1/include" -I"C:/Users/112mackailj/Documents/DirectX 9 Projects" 
CXXINCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64- mingw32/4.8.1/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++" -I"C:/Users/112mackailj/Documents/DirectX 9 Projects" 
BIN  = FLDR-D3D9.exe 
CXXFLAGS = $(CXXINCS) -m32 
CFLAGS = $(INCS) -m32 
RM  = rm.exe -f 

.PHONY: all all-before all-after clean clean-custom 

all: all-before $(BIN) all-after 

clean: clean-custom 
    ${RM} $(OBJ) $(BIN) 

$(BIN): $(OBJ) 
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) 

GFX.o: GFX.cpp 
    $(CPP) -c GFX.cpp -o GFX.o $(CXXFLAGS) 

FuzzyObject.o: FuzzyObject.cpp 
    $(CPP) -c FuzzyObject.cpp -o FuzzyObject.o $(CXXFLAGS) 

Personality.o: Personality.cpp 
    $(CPP) -c Personality.cpp -o Personality.o $(CXXFLAGS) 

Main.o: Main.cpp 
    $(CPP) -c Main.cpp -o Main.o $(CXXFLAGS) 

FuzzyGame.o: FuzzyGame.cpp 
    $(CPP) -c FuzzyGame.cpp -o FuzzyGame.o $(CXXFLAGS) 

FLDR-D3D9_private.res: FLDR-D3D9_private.rc 
    $(WINDRES) -i FLDR-D3D9_private.rc -F pe-i386 --input-format=rc -o FLDR-D3D9_private.res -O coff 
+0

Спасибо, что нашли! :) Но как его изменить? Я немного noobish с файлами make ...: D – FuzzyQuills

Смежные вопросы