I do not know if this is the cause, but unlike in Windows with Microsoft compilers, the order of modules specified in the linker command matters in linux / gcc. If any module depends on references defined in another module, the module that resolves the dependency must come after the module that needs it on the command line.

I pounded my head on the wall for some time trying to get something to link before I learned this nugget.