Visual Studio 2010 - 致命错误 LNK1120: 1 unresolved externals; C++

Posted

技术标签:

【中文标题】Visual Studio 2010 - 致命错误 LNK1120: 1 unresolved externals; C++【英文标题】:Visual Studio 2010- fatal error LNK1120: 1 unresolved externals; c++ 【发布时间】:2015-10-24 05:49:43 【问题描述】:

我收到了错误:

asteroid.obj:错误 LNK2001:无法解析的外部符号“私有: 静态字符 (* Asteroid::Image)[4]" (?Image@Asteroid@@0PAY03DA) 1>C:\用户\约翰\文档\Visual Studio 2010\Projects\assignment3.1\Debug\assignment3.1.exe:致命错误 LNK1120: 1 个未解决的外部问题

而且我没有看到代码中的问题。我的程序中唯一改变的是我的“Image”和“LoadImage”成员函数。

这就是我在头文件中的代码现在的样子(跳过一些公共函数)

class Asteroid

private:
static const int ROWS = 3;
static const int COLUMNS = 4;
int row;
int column;
int row_size;
int column_size;
unsigned int ore_value;
static char Image[ROWS][COLUMNS];

public: static void LoadImage();
;

这就是 .cpp 文件中 LoadImage() 函数的样子

void Asteroid::LoadImage()

string myline;
ifstream asteroid_image_data("asteroid.txt");
if (asteroid_image_data.fail())

    cerr << "Asteroid image file is not available" << endl;
    return;


for (unsigned int i = 0; i < ROWS; i++)

    getline(asteroid_image_data, myline, '\n');
    if (!asteroid_image_data)
    
        cerr << "Asteroid image file is missing some data" << endl;
        return;
    

    for (unsigned int j = 0; j < COLUMNS; j++)
    
        Image[i][j] = myline[j];
    

asteroid_image_data.close();

来自main.cpp的调用只是

Asteroid::LoadImage();

【问题讨论】:

如果你定义图像不是静态的会发生什么? 您的链接未显示您的所有代码 @MORTAL 我得到::: 1>c:\users\john\documents\visual studio 2010\projects\assignment3.1\assignment3.1\asteroid.cpp(38):错误 C2597:非法引用非静态成员 'Asteroid::Image' 1>c:\users\john\documents\visual studio 2010\projects\assignment3.1\assignment3.1\asteroid.cpp(38):错误 C3867 : 'Asteroid::Image': 函数调用缺少参数列表;使用 '&Asteroid::Image' 创建指向成员 1>c:\users\john\documents\visual studio 2010\projects\assignment3.1\assignment3.1\asteroid.cpp(38) 的指针:错误 C2109:下标需要数组或指针类型 很难知道是什么原因造成的。以及如何在没有代码的情况下修复它。如果您的代码很长,您可能需要编写 min-example 【参考方案1】:

你必须为静态字符数组添加一个定义

下面是头cpp文件中的操作方法:

   char Asteroid::Image[3][4] =  '0','0','0','0',
                                   '0','0','0','0',
                                   '0','0','0','0'
                                ;

或者

   char Asteroid::Image[3][4];

这样没问题,行得通

Your header file (Header.h):

        #pragma once

        #include <string>

        using namespace std;

        class Asteroid
        
        private:
            static const int ROWS = 3;
            static const int COLUMNS = 4;
            int row;
            int column;
            int row_size;
            int column_size;
            unsigned int ore_value;
            static char Image[ROWS][COLUMNS];

            public: static void LoadImage();
        ;

Header.cpp:

#include "Header.h"
#include <fstream>
#include <iostream>

using namespace std;

void Asteroid::LoadImage()

    string myline;
    ifstream asteroid_image_data("asteroid.txt");

    if (asteroid_image_data.fail())
    
        cerr << "Asteroid image file is not available" << endl;
        return;
    

    for (unsigned int i = 0; i < ROWS; i++)
    
        getline(asteroid_image_data, myline, '\n');

        if (!asteroid_image_data)
        
            cerr << "Asteroid image file is missing some data" << endl;
            return;
        

        for (unsigned int j = 0; j < COLUMNS; j++)
        
            Image[i][j] = myline[j];
        
    
    asteroid_image_data.close();


char Asteroid::Image[3][4];

主文件(Source.cpp):

    #include <iostream>
    #include "Header.h""

    int main() 

        Asteroid::LoadImage();
    

【讨论】:

是的,我认为 OP 没有声明图像。你可以像这样声明它char Asteroid::Image[3][4] 没有0 编译会将它初始化为零,因为它是静态的。 没关系,我可以改一下 哦,是的,我现在明白了,再次感谢,他有我认为的选择

以上是关于Visual Studio 2010 - 致命错误 LNK1120: 1 unresolved externals; C++的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 2010 中调试时出现致命错误 HRESULT=0x80131c08

如何解决Visual Studio 2010 Ultimate中的CVT1100?

Visual Studio 2017 - Git 因致命错误而失败

Visual Studio 2019 CVT1101 & LNK1123 致命错误

致命错误 C1010 - Visual Studio 中的“stdafx.h”如何纠正?

致命错误 LNK1201:写入程序数据库时出错 - Visual Studio 2003