Unresolved External Symbol Error with Plugin. Failure to link .cpp file

TLDR: The linker can find my header file, but can’t find the associated cpp. I don’t understand why.

Hey! I have run through a few different posts including:
The Unresolved External Symbols Answer By Shadowriver
And watched a few videos including:
Ari’s Talk On Improving Code Structure With Unreal Engine’s C++ Modules

Unfortunately, it seems I am still missing an essential piece of info.

For sake of this issue, I created a default Third Person Project with C++ named ScratchPad.
I enabled the Visual Studio Integration Tools plugin.
I then created a blank plugin that I called TestPlugin.

All other settings and code unless called out explicitly below are default to UE5.2.1 (The latest release at the time of writing this post)

To demonstrate the issue I’m having, I did the following:
I renamed the automatically generated TestPlugin.h/.cpp to TestPluginModule.h/.cpp.

I added a test function that I tried to pattern off of a module I know is working, HTTPServer

I modified TestPluginModule.h to be the following:
image

I modified TestPluginModule.cpp to be the following:

I edited ScratchPad.Build.cs to include both the TestPlugin & HTTPServer modules
I added “TestPlugin” and “HTTPServer” to the PublicDependencyModuleNames list.

I then saved everything, refreshed Visual Studio via the option in the tools menu of UE5, and proceeded to edit ScratchPadGameModule.cpp to be the following:

This code, in addition to its default functionality, simply calls the IsAvailable method of the FHttpServerModule class. This code compiles and links just as expected. Success.

However, if I swap which line is commented, and thus call into the IsAvailable method of the FTestPluginModule, I run into a linker error.

The specific linker error is the following:
ScratchPadGameMode.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static bool __cdecl FTestPluginModule::IsAvailable(void)" (__imp_?IsAvailable@FTestPluginModule@@SA_NXZ) referenced in function "public: __cdecl AScratchPadGameMode::AScratchPadGameMode(void)" (??0AScratchPadGameMode@@QEAA@XZ)

If we sort out the garbage, essentially this is just saying that the linker can’t find a definition for FTestPluginModule::IsAvailable

In an attempt to understand more about the issue, I shifted the function body from the .cpp to the .h as in the following:

This code successfully links. This leads me to believe that the linker has no trouble finding the .h file for TestPluginModule.h, but for some reason isn’t able to find the .cpp.

As far as I can tell, I have followed the rules for setting up a module including adding the module to the dependency list of the primary game module and marking the function I want exported with the MODULENAME_API macro. So, at this point, I’m at a loss. I don’t understand how the code I wrote is different from the HTTPServer code. I don’t understand what is different about the way I’m trying to use my code vs that code that breaks the linker.

Any help or pointers would be appreciated. Thanks!