Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2016, 14:36   #1
Joki
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 10
По умолчанию error LNK2028: unresolved token (0A0004A0) referenced in function

Добрый день форумчане. Я буквально недели 3 назад начал пробовать себя в Visual Studio. До этого немного кодил на Delphi. И вот у меня есть задачка, вроде уже изюзанная по просторам интрнета, отобразить модель созданную в 3D максе или еще в чем другом в своей программе, саама цель далеко идущая, но не суть дела. Возникла проблема, я создал новый CLR проект, взял чужой класс, импортнул его к себе в проект и пытаюсь в главной форме его вызвать, но вылетают различные ошибки, в частности та, которая в оглавление темы приведу код:
Чужой класс
Цитата:
#ifndef MESH_H
#define MESH_H

#include <Importer.hpp>
#include <scene.h>
#include <postprocess.h>

#include <map>
#include <vector>
#include <glew.h>

#include "util.h"
#include "math_3d.h"
#include "texture.h"

struct Vertex
{
Vector3f m_pos;
Vector2f m_tex;
Vector3f m_normal;

Vertex() {}

Vertex(const Vector3f& pos, const Vector2f& tex, const Vector3f& normal)
{
m_pos = pos;
m_tex = tex;
m_normal = normal;
}
};

class Mesh
{
public:
Mesh(){};
~Mesh(){
Clear();
};
bool LoadMesh(const std::string& Filename);
void Render();

private:
bool InitFromScene(const aiScene* pScene, const std::string& Filename);
void InitMesh(unsigned int Index, const aiMesh* paiMesh);
bool InitMaterials(const aiScene* pScene, const std::string& Filename);
void Clear();

#define INVALID_MATERIAL 0xFFFFFFFF

struct MeshEntry{
MeshEntry();
~MeshEntry();

bool Init(const std::vector<Vertex>& Vertices,
const std::vector<unsigned int>& Indices);

GLuint VB;
GLuint IB;

unsigned int NumIndices;
unsigned int MaterialIndex;
};

std::vector<MeshEntry> m_Entries;
std::vector<Texture*> m_Textures;
};

#endif /* MESH_H */
главная форма, в будущем хочу указывать через опендиалог какой файл подгружать:

Цитата:
#pragma once
#include "mesh.h"


namespace LoaderMesh {

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

/// <summary>
/// Summary for MyForm
/// </summary>
public ref class MyForm : public System::Windows::Forms::Form
{
public:
MyForm(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}

protected:
/// <summary>
/// Clean up any resources being used.
/// </summary>
~MyForm()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Button^ button1;
protected:

private:
GLuint m_VBO;
GLuint m_IBO;
LightingTechnique* m_pEffect;
//Mesh^ m_pMesh;
Camera* m_pGameCamera;
float m_scale;
DirectionalLight * m_directionalLight;
/// <summary>
/// Required designer variable.
/// </summary>
System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
void InitializeComponent(void)
{
this->button1 = (gcnew System::Windows::Forms::Button());
this->SuspendLayout();
//
// button1
//
this->button1->Location = System::Drawing::Point(0, 0);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(75, 23);
this->button1->TabIndex = 0;
this->button1->Text = L"button1";
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);
//
// MyForm
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMo de::Font;
this->ClientSize = System::Drawing::Size(284, 262);
this->Controls->Add(this->button1);
this->Name = L"MyForm";
this->Text = L"MyForm";
this->ResumeLayout(false);

}
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

Mesh * m_pMesh;
m_pMesh->LoadMesh("../Content/phoenix_ugv.md2");

}
};
}
объявляю вроде как по правилам, но ничего не выходит. Очень прошу помочь.
Joki вне форума Ответить с цитированием
Старый 09.06.2016, 14:47   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Я буквально недели 3 назад начал пробовать себя в Visual Studio. До этого немного кодил на Delphi.
И взяли поделку вместо нормальных языков. Брали б C# сразу и все.

По ошибке: у вас в настройках указано /clrure, что указывает на __clrcall тип вызовов функции, а вы пытаетесь вызвать стандартный __cdecl, например. Естественно не находитсо.
p51x вне форума Ответить с цитированием
Старый 09.06.2016, 15:21   #3
Joki
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 10
По умолчанию

Да я бы с удовольствием взял что-то другое, но весь проект, над которым тружусь не я 1 пишется на Wisual Studio 2013. Вы бы не могли более на пальцах объяснить как можно это исправить, а то я уже как только не извращался, пытался из чужого класса ref класс смастерить. но ни вкакую, Очень извиняюсь за глупость.
Joki вне форума Ответить с цитированием
Старый 09.06.2016, 16:03   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Да я бы с удовольствием взял что-то другое, но весь проект, над которым тружусь не я 1 пишется на Wisual Studio 2013.
И? Вы в курсе, чем ИДЕ отличается от языка программирования?

Цитата:
Вы бы не могли более на пальцах объяснить как можно это исправить
1. Зайти в project - properties найти соглашение /clrure и поменять на /clr
2. Взять один из нормальных языков C++, C#, ...
p51x вне форума Ответить с цитированием
Старый 09.06.2016, 16:12   #5
Joki
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 10
По умолчанию

Я понимаю, что можно было бы выбрать борланд c к примеру, но мнеже потом и внедрять это в их среду, учитывая что я не особо разбираюсь в ней.

Нашел соглашение и у меня уже стояло /clr
Joki вне форума Ответить с цитированием
Старый 09.06.2016, 16:14   #6
Joki
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 10
По умолчанию

вот полный текст ошибки
Error 2 error LNK2028: unresolved token (0A0004A0) "public: __thiscall Mesh::MeshEntry::~MeshEntry(void)" (??1MeshEntry@Mesh@@$$FQAE@XZ) referenced in function "public: void * __thiscall Mesh::MeshEntry::`scalar deleting destructor'(unsigned int)" (??_GMeshEntry@Mesh@@$$FQAEPAXI@Z) D:\WisualStudio\Import_export\Loade rMesh\LoaderMesh\MyForm.obj LoaderMesh
Joki вне форума Ответить с цитированием
Старый 09.06.2016, 16:51   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Где у вас тело деструктора Mesh::MeshEntry::~MeshEntry ?
waleri вне форума Ответить с цитированием
Старый 09.06.2016, 16:55   #8
Joki
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 10
По умолчанию

В файле mesh.cpp

Цитата:
#include <assert.h>

#include "mesh.h"

Mesh::MeshEntry::MeshEntry()
{
VB = INVALID_OGL_VALUE;
IB = INVALID_OGL_VALUE;
NumIndices = 0;
MaterialIndex = INVALID_MATERIAL;
}

Mesh::MeshEntry::~MeshEntry()
{
if (VB != INVALID_OGL_VALUE){
glDeleteBuffers(1, &VB);
}

if (IB != INVALID_OGL_VALUE){
glDeleteBuffers(1, &IB);
}
}

bool Mesh::MeshEntry::Init(const std::vector<Vertex>& Vertices,
const std::vector<unsigned int>& Indices)
{
NumIndices = Indices.size();

glGenBuffers(1, &VB);
glBindBuffer(GL_ARRAY_BUFFER, VB);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)*Vertices.size(),
&Vertices[0], GL_STATIC_DRAW);

glGenBuffers(1, &IB);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFE R, IB);
glBufferData(GL_ELEMENT_ARRAY_BUFFE R, sizeof(unsigned int)*NumIndices,
&Indices[0], GL_STATIC_DRAW);

return true;
}

void Mesh::Clear()
{
for (unsigned int i = 0; i < m_Textures.size(); i++){
SAFE_DELETE(m_Textures[i]);
}
}

bool Mesh::LoadMesh(const std::string& Filename)
{
// Удаляем данные предыдущей модели (если она была загружена)
Clear();

bool Ret = false;

Assimp::Importer Importer;

const aiScene* pScene = Importer.ReadFile(Filename.c_str(),
aiProcess_Triangulate | aiProcess_GenSmoothNormals|
aiProcess_FlipUVs);

if (pScene){
Ret = InitFromScene(pScene, Filename);
}
else {
printf("Error parsing '%s': '%s'\n", Filename.c_str(), Importer.GetErrorString());
}

return Ret;
}

bool Mesh::InitFromScene(const aiScene* pScene, const std::string& Filename)
{
m_Entries.resize(pScene->mNumMeshes);
m_Textures.resize(pScene->mNumMaterials);

// Инициализируем меши один за другим
for (unsigned int i = 0; i < m_Entries.size(); i++){
const aiMesh* paiMesh = pScene->mMeshes[i];
InitMesh(i, paiMesh);
}

return InitMaterials(pScene, Filename);
}

void Mesh::InitMesh(unsigned int Index, const aiMesh* paiMesh)
{
m_Entries[Index].MaterialIndex = paiMesh->mMaterialIndex;

std::vector<Vertex> Vertices;
std::vector<unsigned int> Indices;

const aiVector3D Zero3D(0.0f, 0.0f, 0.0f);
for (unsigned int i = 0; i< paiMesh->mNumVertices; i++){
const aiVector3D* pPos = &(paiMesh->mVertices[i]);
const aiVector3D* pNormal = &(paiMesh->mNormals[i]);
const aiVector3D* pTexCoord = paiMesh->HasTextureCoords(0) ?
&(paiMesh->mTextureCoords[0][i]) : &Zero3D;

Vertex v(Vector3f(pPos->x, pPos->y, pPos->z),
Vector2f(pTexCoord->x,pTexCoord->y),
Vector3f(pNormal->x, pNormal->y, pNormal->z));
Vertices.push_back(v);
}

for (unsigned int i = 0; i < paiMesh->mNumFaces; i++){
const aiFace& Face = paiMesh->mFaces[i];
assert(Face.mNumIndices == 3);
Indices.push_back(Face.mIndices[0]);
Indices.push_back(Face.mIndices[1]);
Indices.push_back(Face.mIndices[2]);
}

m_Entries[Index].Init(Vertices, Indices);
}

bool Mesh::InitMaterials(const aiScene* pScene, const std::string& Filename)
{
// Извлекаем директорию из полного имени файла
std::string::size_type SlashIndex = Filename.find_last_of("/");
std::string Dir;

if (SlashIndex == std::string::npos){
Dir = ".";
}
else if (SlashIndex == 0){
Dir = "/";
}
else {
Dir = Filename.substr(0, SlashIndex);
}

bool Ret = true;

// Инициализируем материал
for (unsigned int i = 0; i< pScene->mNumMaterials; i++){
const aiMaterial* pMaterial = pScene->mMaterials[i];

m_Textures[i] = NULL;
if (pMaterial->GetTextureCount(aiTextureType_DIFF USE) > 0){
aiString Path;

if (pMaterial->GetTexture(aiTextureType_DIFFUSE , 0, &Path,
NULL, NULL, NULL, NULL, NULL) == AI_SUCCESS){
std::string FullPath = Dir + "/" + Path.data;
m_Textures[i] = new Texture(GL_TEXTURE_2D, FullPath.c_str());

if (!m_Textures[i]->Load()){
printf("Error loading texture '%s'\n", FullPath.c_str());
delete m_Textures[i];
m_Textures[i] = NULL;
Ret = false;
}
}
}

// Загружаем белую текстуру если модель не имеет собственной
if (!m_Textures[i]){
m_Textures[i] = new Texture(GL_TEXTURE_2D, "../Content/white.png");
Ret = m_Textures[i]->Load();
}
}

return Ret;
}

void Mesh::Render()
{
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);

for (unsigned int i = 0; i < m_Entries.size(); i++){
glBindBuffer(GL_ARRAY_BUFFER, m_Entries[i].VB);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)12);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)20);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFE R, m_Entries[i].IB);

const unsigned int MaterialIndex = m_Entries[i].MaterialIndex;

if (MaterialIndex < m_Textures.size() && m_Textures[MaterialIndex]){
m_Textures[MaterialIndex]->Bind(GL_TEXTURE0);
}

glDrawElements(GL_TRIANGLES, m_Entries[i].NumIndices, GL_UNSIGNED_INT, 0);
}

glDisableVertexAttribArray(2);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(0);
}
Joki вне форума Ответить с цитированием
Старый 09.06.2016, 17:17   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Я понимаю, что можно было бы выбрать борланд c к примеру, но мнеже потом и внедрять это в их среду, учитывая что я не особо разбираюсь в ней.
не понимаете.
среда Visual Studio поддерживает более 10-и языков.
вместо чистого С++, вы взяли С++CLI(это нечно среднее между С++ и C#), в итого страдаете.
а ради чего? что там формочки можно рисовать?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.06.2016, 17:23   #10
Joki
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 10
По умолчанию

Я взял его не из-за своей прихоти или удобства, а от того, что весь UI собран уже в этой среде и подобном проекте, да и не малое количество кода там же.
Мне просто поставили эту функцию в задачу.
Joki вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OCCI. Unresolved unresolved token mibin Visual C++ 3 24.10.2014 11:00
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main Debug/main.exe : fatal error LNK11 prefak Win Api 0 19.04.2009 16:51
Программирование под Windows (ошибка), как избежать ошибки Unresolved external '_main' referenced fro DeLure Общие вопросы C/C++ 2 02.03.2008 01:35