The sshmem/ucx and atomic/ucx components are directly including the spml_ucx.h header file from the spml/ucx component, and directly using symbols from the spml/ucx_component.
This is an abstraction violation and is not allowed in the MCA architecture.  It works if you --disable-dlopen (and slurp all components up into liboshmem), but it does not work if the components are all individual DSOs that are dlopened individually.
The atomic/ucx behavior exists on master, v3.x, v2.x, and v2.0.x.
The sshmem/ucx behavior exists on master and v3.x.
(I didn't bother checking back as far as v1.10)