This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

C++ extern const link error

In C++, I tried to reference a constant in flash defined in another file using this declaration:

extern const int count;

In another C++ file I had the definition:

const int count = 1;

(The original test case had more to it, but I boiled it down to this simple scenario.)

The linker gives the error "undefined reference to 'count'".  I am using ARM GCC 9.3.1 on a Cortex-M0+ MCU.

I found if I took off the "const" in both places, thus moving it from flash to RAM, there was no problem.  I also eventually figured out that it all linked (and lived in flash) if I added 'extern "C"' to both.  This is an adequate work-around, but I'd like to know what the problem is.  Is it a bug?  Is there something missing from my declarations?

Parents
  • Is there something missing from my declarations?

    No, there is nothing missing from your declarations.  What you need to change is your definition.

    "extern const int count = 1" should "fix" the issue you are seeing.

    In C++, const global variable definitions have internal linkage by default

    In C++. non-const global variable definitions have external linkage by default

    This means to share a constant global, both the declaration AND the definition needs to be extern.

    To share a variable global, only the declaration needs the extern in front of it.  The definition is by default considered external linkage. 

Reply
  • Is there something missing from my declarations?

    No, there is nothing missing from your declarations.  What you need to change is your definition.

    "extern const int count = 1" should "fix" the issue you are seeing.

    In C++, const global variable definitions have internal linkage by default

    In C++. non-const global variable definitions have external linkage by default

    This means to share a constant global, both the declaration AND the definition needs to be extern.

    To share a variable global, only the declaration needs the extern in front of it.  The definition is by default considered external linkage. 

Children
No data