Precompiled headers only cache header parsing. The parsed header still needs to be integrated into the rest of the C/C++ file and the result still needs to be optimized.
SO files are the UNIX flavor of dynamic libraries. Both static and dynamic libraries contained fully compiled and optimized functions that only need to be linked.
Linking finished external nontrivial functions will always be faster than expanding inline functions from (compiled or plaintext) header files.
Moving the contents of a header file to an object file/library doesn't really make sense, though. A normally used header file should only contain macros, type/type-alias definitions, inline functions, and, in C++, template definitions. None of that those generate linkable objects (external symbol definitions). Compiling a normal header file into an object file should always yield an empty object file.
Moving inlinable code from header files to C/C++ files (or at least isolating rarely used inline code away from a frequently included header files) while making it noninlinable is always a good idea as far as build times are concerned, but changing a function from inlinable to noninlinable can have noticeable runtime performance consequences where inlining is truly warranted (rare; usually very small functions only), so it shouldn't be done mindlessly.
same headers built to .so file objectsHeaders are also not inside a .so shared library.