使用其他类的构造函数时出现链接器错误“未解析的外部符号”

Linker Error "unresolved external symbol" when using constructor of other class

提问人:Hoxbot 提问时间:5/8/2020 更新时间:5/8/2020 访问量:549

问:

我一直在努力寻找为什么我的链接器会出现未解决的外部符号错误。错误如下所示:

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());
}

-class 在 swift_open_gl.h 文件中定义:Shader

#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
}

我已经尝试过使用和不使用(当我尝试在 .h 文件和 .cpp 文件之间移动函数定义时,Visual Studio 添加了它,所以我决定尝试一下),并且我已经验证了除了上面列出的文件之外,项目中的其他任何地方都不会发生。inline#include <../swift_open_gl.h>

多一双眼睛来观察这一点将不胜感激!

C++ 包含 链接器错误 未解决的外部

评论

1赞 armagedescu 5/8/2020
CPP 文件被编译为目标文件。对象文件链接到可执行文件。它可以在将所有 cpp 文件编译在一起时隐式完成,也可以在首次编译和生成对象文件时显式完成。之后,将对象文件链接在一起。如果使用 IDE,则应将所有文件添加到同一项目中,并且 IDE 将关心文件的编译和链接方式。
0赞 drescherjm 5/8/2020
inline Shader::Shader(const char * cs_path) {摆脱并确保它是您项目的一部分。inlineswift_open_gl.cpp
0赞 ChrisMM 5/9/2020
这回答了你的问题吗?什么是未定义的引用/未解析的外部符号错误,如何解决?

答:

1赞 user9559196 5/8/2020 #1

同时提供类的默认构造函数。

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

不要在 Shader::Shader(const char* cs_path){} 定义中使用内联

评论

0赞 Hoxbot 5/8/2020
添加默认构造函数做到了!谢谢!