Ошибка компоновщика "неразрешенный внешний символ" при использовании конструктора другого класса - PullRequest
0 голосов
/ 07 мая 2020

Я изо всех сил пытался понять, почему мой компоновщик получает неразрешенную ошибку внешнего символа. Ошибка выглядит так:

Error
LNK2019
unresolved external symbol "public: __thiscall Shader::Shader(char const *)" (??0Shader@@QAE@PBD@Z) referenced in function "public: __thiscall GridWorldGPGPU::GridWorldGPGPU(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,unsigned int)" (??0GridWorldGPGPU@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@I@Z)
DV2556_Project  
grid_world_GPGPU.obj
1       

Насколько я понимаю, это как-то связано с тем, что мой компоновщик находит объявление Shader::Shader(char const *) -функции, но не может найти определение. Я смотрел на это часами и не могу понять, почему компоновщик становится грустным.

grid_world_GPGPU.h:

#ifndef GRID_WORLD_GPGPU_H
#define GRID_WORLD_GPGPU_H

#include "grid_world.h"
#include <../swift_open_gl.h>

class GridWorldGPGPU : public GridWorld {
private:
    Shader* compute_shader_ = nullptr;

public:
    GridWorldGPGPU(std::string in_path_shader, unsigned int in_side = 1);
};

#endif // !GRID_WORLD_GPGPU_H

grid_world_GPGPU. cpp:

GridWorldGPGPU::GridWorldGPGPU(std::string in_path_shader, unsigned int in_side)
    : GridWorld(in_side) {
    this->compute_shader_ = new Shader(in_path_shader.c_str());
}

Класс Shader определен в файле swift_open_gl.h :

#ifndef SWIFT_OPEN_GL_H
#define SWIFT_OPEN_GL_H

#include <glad/glad.h>
#include <GLFW/glfw3.h>

class Shader {
public:
    Shader(const char* cs_path);
};
#endif // !SWIFT_OPEN_GL_H

и swift_open_gl. cpp имеет это:

#include "..\swift_open_gl.h"

inline Shader::Shader(const char * cs_path) {
    //Do stuff
}

Я пробовал с inline и без него (Visual Studio добавила его, когда я пытался переместить определение функции между .h-файлом и файлом. cpp -файл, поэтому я решил попробовать его) и убедился, что #include <../swift_open_gl.h> не встречается в проекте где-либо еще, кроме файлов, перечисленных выше.

Дополнительная пара глаз, чтобы смотреть за это был бы признателен!

1 Ответ

1 голос
/ 07 мая 2020

Также укажите конструктор класса по умолчанию.

class Shader {
    public:
    Shader(){} // default constructor
    Shader(const char* cs_path);    
    };

Не используйте inline в Shader :: Shader (const char * cs_path) {} определение

...