Отредактировано: добавлен класс шейдеров.
Я пишу библиотеку DLL, но MS VS intellisense и компилятор жалуются на конструктор Mesh. Если я изменю атрибут материала в конструкторе сетки на текстуру, то все в порядке. Я пытался изменить структуру на класс, но это не сработало. Удаление FFB_FRAMEWORK_API marcro тоже не работает.
DataStrictures.h
struct Vertex {
// position
glm::vec3 Position;
// normal
glm::vec3 Normal;
// texCoords
glm::vec2 TexCoords;
// tangent
glm::vec3 Tangent;
// bitangent
glm::vec3 Bitangent;
};
struct Texture
{
unsigned int id;
std::string type;
};
main.h
#ifdef FFB_FRAMEWORK_EXPORTS
#define FFB_FRAMEWORK_API __declspec(dllexport)
#else
#define FFB_FRAMEWORK_API __declspec(dllimport)
#endif
class FFB_FRAMEWORK_API Shader
{
public:
unsigned int ID;
// constructor generates the shader on the fly
Shader(const char* vertexPath, const char* fragmentPath, const char* geometryPath = nullptr);
// activate the shader
void use();
// utility uniform functions
void setBool(const std::string &name, bool value) const;
void setInt(const std::string &name, int value) const;
void setFloat(const std::string &name, float value) const;
void setVec2(const std::string &name, const glm::vec2 &value) const;
void setVec2(const std::string &name, float x, float y) const;
void setVec3(const std::string &name, const glm::vec3 &value) const;
void setVec3(const std::string &name, float x, float y, float z) const;
void setVec4(const std::string &name, const glm::vec4 &value) const;
void setVec4(const std::string &name, float x, float y, float z, float w);
void setMat2(const std::string &name, const glm::mat2 &mat) const;
void setMat3(const std::string &name, const glm::mat3 &mat) const;
void setMat4(const std::string &name, const glm::mat4 &mat) const;
private:
// utility function for checking shader compilation/linking errors.
void checkCompileErrors(GLuint shader, std::string type);
};
struct FFB_FRAMEWORK_API Material
{
Shader shader;
std::vector<Texture> textures;
};
class FFB_FRAMEWORK_API Mesh
{
private:
std::vector<Vertex> m_vertices;
std::vector<unsigned int> m_indices;
Material m_material;
unsigned int VAO, VBO, EBO;
void SetupMesh();
public:
Mesh(std::vector<Vertex> vertices, std::vector<unsigned int> indices, Material material);
void Draw(Shader shader);
};
Mesh.h
Mesh::Mesh(std::vector<Vertex> vertices, std::vector<unsigned int> indices, Material material)
{
m_vertices = vertices;
m_indices = indices;
m_material = material;
// now that we have all the required data, set the vertex buffers and its attribute pointers.
SetupMesh();
}
Компилятор жалуется прямо перед m_verticies = вершинами
Код серьезности Описание Ошибка состояния подавления строки файла проекта
(активный) E1790 конструктор по умолчанию
На «Framework :: Graphics :: Material» нельзя ссылаться — это
удаленная функция FFB_Framework c: \ Users \ Пользователь \ Documents \ Visual Studio
2017 \ Проекты \ FFB \ FFB_Framework \ Mesh.cpp 7
Ред.
Если я меняю конструктор на
Mesh::Mesh(std::vector<Vertex> vertices, std::vector<unsigned int> indices, Material material):m_vertices(vertices),m_indices(indices),m_material(material)
{SetupMesh();}
Компилятор выдает эти ошибки:
Код серьезности Описание Состояние подавления строки файла проекта
Ошибка LNK2019: неразрешенный внешний символ «__declspec (dllimport)
public: __cdecl Framework :: Graphics :: Material :: ~ Material (void) «(__ imp _ ?? 1Material @ Graphics @ Framework @@ QEAA @ XZ), на который ссылается функция
«public: __cdecl Framework :: Graphics :: Mesh :: Mesh (класс
std :: vector>, класс
std :: vector>, struct
Рамки :: Графика :: Материал) «(?? 0Mesh @ Графика @ Framework @@ QEAA @ V? $ Вектор @ UVertex @@ V? $ Распределитель @ UVertex @@@ станд @@@ станд @@ V? $ Вектор @ IV? $ Allocator @ I @ std @@@ 4 @ UMaterial @ 12 @@ Z) FFB_Framework C: \ Users \ Anton \ Documents \ Visual
Studio 2017 \ Проекты \ FFB \ FFB_Framework \ Mesh.obj 1Код серьезности Описание Состояние подавления строки файла проекта
Ошибка LNK2019: неразрешенный внешний символ «__declspec (dllimport)
public: __cdecl Framework :: Graphics :: Material :: Material (struct
Framework :: Графика :: Материал const &) «(__ imp _ ?? 0Material @ Graphics @ Framework @@ QEAA @ AEBU012 @@ Z) упоминается в
функция «public: __cdecl Framework :: Graphics :: Mesh :: Mesh (класс
std :: vector>, класс
std :: vector>, struct
Рамки :: Графика :: Материал) «(?? 0Mesh @ Графика @ Framework @@ QEAA @ V? $ Вектор @ UVertex @@ V? $ Распределитель @ UVertex @@@ станд @@@ станд @@ V? $ Вектор @ IV? $ Allocator @ I @ std @@@ 4 @ UMaterial @ 12 @@ Z) FFB_Framework C: \ Users \ Anton \ Documents \ Visual
Studio 2017 \ Проекты \ FFB \ FFB_Framework \ Mesh.obj 1
Кто-нибудь знает где ошибка?
Вы используете назначение для m_material
переменная. Прежде чем войти в тело Mesh
Конструктор По умолчанию вызывается конструктор m_material, который удаляется. Вы можете реорганизовать конструктор следующим образом и предоставить соответствующий конструктор для Material
Mesh::Mesh(std::vector<Vertex> vertices, std::vector<unsigned int> indices, Material material) : m_vertices(vertices), m_indices(indices), m_material(material)
{
// now that we have all the required data, set the vertex buffers and its attribute pointers.
SetupMesh();
}
Других решений пока нет …