Big Yes. You compile the module (*MODULE), build it into a service program (*SRVPGM), add the serv pgm to a binding directory (WRKBNDDIR), and nominate the binding directory either on the H-spec or the CRTxxx command of the calling program.
And if you’re smart you will have the prototypes of the function(s) in the same module src member with conditional compile directives. Something like:
H Nomain etc.
D-specs for prototype (PR)
code function implementation here.
Then DEFINE(Module) as you compile the module itself. Any pgm wanting to use the functions can just /include the src and will only see the PR specs.