Since they aren't static or inline, the compiler exports the symbols. The reason this bites us at is that the "sim: Include object header files in SWIG interfaces" (#1501) includes the header file in the SWIG wrapper, which creates a link error by exporting a second version the symbols.
Makes perfect sense. Would have been great to see in the patch description :). Thanks for clearing that question mark.