Unresolved external symbol on static class members

150,710

Solution 1

If you are using C++ 17 you can just use the inline specifier (see https://stackoverflow.com/a/11711082/55721)


If using older versions of the C++ standard, you must add the definitions to match your declarations of X and Y

unsigned char test::X;
unsigned char test::Y;

somewhere. You might want to also initialize a static member

unsigned char test::X = 4;

and again, you do that in the definition (usually in a CXX file) not in the declaration (which is often in a .H file)

Solution 2

Static data members declarations in the class declaration are not definition of them. To define them you should do this in the .CPP file to avoid duplicated symbols.

The only data you can declare and define is integral static constants. (Values of enums can be used as constant values as well)

You might want to rewrite your code as:

class test {
public:
  const static unsigned char X = 1;
  const static unsigned char Y = 2;
  ...
  test();
};

test::test() {
}

If you want to have ability to modify you static variables (in other words when it is inappropriate to declare them as const), you can separate you code between .H and .CPP in the following way:

.H :

class test {
public:

  static unsigned char X;
  static unsigned char Y;

  ...

  test();
};

.CPP :

unsigned char test::X = 1;
unsigned char test::Y = 2;

test::test()
{
  // constructor is empty.
  // We don't initialize static data member here, 
  // because static data initialization will happen on every constructor call.
}

Solution 3

in my case, I declared one static variable in .h file, like

//myClass.h
class myClass
{
static int m_nMyVar;
static void myFunc();
}

and in myClass.cpp, I tried to use this m_nMyVar. It got LINK error like:

error LNK2001: unresolved external symbol "public: static class... The link error related cpp file looks like:

//myClass.cpp
void myClass::myFunc()
{
myClass::m_nMyVar = 123; //I tried to use this m_nMyVar here and got link error
}

So I add below code on the top of myClass.cpp

//myClass.cpp
int myClass::m_nMyVar; //it seems redefine m_nMyVar, but it works well
void myClass::myFunc()
{
myClass::m_nMyVar = 123; //I tried to use this m_nMyVar here and got link error
}

then LNK2001 is gone.

Solution 4

Since this is the first SO thread that seemed to come up for me when searching for "unresolved externals with static const members" in general, I'll leave another hint to solve one problem with unresolved externals here:

For me, the thing that I forgot was to mark my class definition __declspec(dllexport), and when called from another class (outside that class's dll's boundaries), I of course got the my unresolved external error.
Still, easy to forget when you're changing an internal helper class to a one accessible from elsewhere, so if you're working in a dynamically linked project, you might as well check that, too.

Solution 5

When we declare a static variable in a class, it is shared by all the objects of that class. As static variables are initialized only once they are never initialized by a constructor. Instead, the static variable should be explicitly initialized outside the class only once using the scope resolution operator (::).

In the below example, static variable counter is a member of the class Demo. Note how it is initialized explicitly outside the class with the initial value = 0.

#include <iostream>
#include <string>
using namespace std;
class Demo{
   int var;
   static int counter;

   public:
   Demo(int var):var(var){
      cout<<"Counter = "<<counter<<endl;
      counter++;
   }
};
int Demo::counter = 0;                 //static variable initialisation
int main()
{
   Demo d(2), d1(10),d3(1);
}

Output:
Count = 0
Count = 1
Count = 2
Share:
150,710

Related videos on Youtube

AustinWBryan
Author by

AustinWBryan

C/C++ and C# Programmer, Unity and Unreal Engine. I am working to get into the video game industry. I first started programming with C++, then begun a journey, learning Python, GoogleScript, JavaScript, jQuery, HTML 5, CSS, BootStrap, Xml, before I finally found C#. I recently returned to C/C++ and picked up Xaml as I began to learn Wpf.

Updated on April 18, 2021

Comments

  • AustinWBryan
    AustinWBryan about 3 years

    Very simply put:

    I have a class that consists mostly of static public members, so I can group similar functions together that still have to be called from other classes/functions.

    Anyway, I have defined two static unsigned char variables in my class public scope, when I try to modify these values in the same class' constructor, I am getting an "unresolved external symbol" error at compilation.

    class test 
    {
    public:
        static unsigned char X;
        static unsigned char Y;
    
        ...
    
        test();
    };
    
    test::test() 
    {
        X = 1;
        Y = 2;
    }
    

    I'm new to C++ so go easy on me. Why can't I do this?

  • Shital Shah
    Shital Shah over 7 years
    If you are writing header-only library, you can use this technique to avoid cpp file: stackoverflow.com/questions/11709859/…
  • Penny
    Penny almost 6 years
    why here in .CPP, it is "unsigned char test::X = 1;" instead of "test::X = 1;"? static variable X already defined, why still need "unsigned char"? @sergtk
  • Anonymous1847
    Anonymous1847 about 4 years
    @Penny Because "test::X = 1;" is interpreted as an assignment, whereas what we're trying to do is a definition.
  • Adrian B.
    Adrian B. about 3 years
    You also may need __declspec(dllimport) if you initialize the static member in the cpp file.