On macOS, what you call a shared object file is call a dynamic library, with a .dylib extension. You can create one using the "-dynamiclib" option to the compiler (if the compiler is driving the link step):
cc -dynamiclib -o foo.dylib foo.m
If you're invoking the linker (ld) directly, you can use the "-dylib" option:
ld -dylib -o foo.dylib foo.o
However, you don't necessarily need a dynamic library. You can just compile and link an Objective-C source file to your other files:
cc -o your_program your_c_file.c your_c++_file.cpp your_objective_c_file.m
Objective-C is an extension of C, so all C code is also Objective-C code with the same semantics. Likewise, Objective-C++ is an extension of C++. So, you can make the interface between your C/C++ code be a typical C/C++ interface (functions, variables, C++ classes, etc.) and use Objective-C(++) in the implementation.