In linux, things are much easier for both "raw" usb devices via libusb or cdc-acm serial ports. The vid/pid/serial can be looked up via libudev and that's it. Everything goes out-of-the-box for the major distros. No drivers needed; the application just must install a udev rule file to /etc/udev/rules.d to give non-root users access to the device. If needed, dynamic renaming of devnodes can be done etc, but usually this is not needed when the application does the lookup and the user does not see or need to know the dev name.
Windows is a different story. Cdc-acm serial still requires inf file to load usbser.sys up to win10 (win10 has finally usbser.sys bound to usb cdc-acm device class!). On win8, your inf has to be signed. On win7 and below, the user can just accept the warning. Still, the inf should be installed before the first connection attempt to give the smoothest user experience or needs to be accessible via windowsupdate. ("install the software before connecting device")
For raw usb devices, libusb works under windows, but has the same inf file problems with installing it. On win8, the signature check can be worked around with zadig-like self-signed locally generated certs, but this is a hack and far from commercial quality user experience. Microsoft has made their own competitor to libusb - winusb. This is a beast compared to libusb. For example, the device is identified by GUID from applications and then there are usb vid/pid to GUID mapping. This winusb thing kind-of-works on all windowses, but differently. Win8 and win10 works driverless - the usb device must present microsoft-specific descriptors, that are hacked on top of existing usb layer and that does not look similar to usb at all (why are the vid/pid not enough; there are some ms descriptors with VeryLongTextualNamesAndValues, that get imported into registry etc). When this is available, libusb loads automatically. On win7 and below, the application must pre-install inf and some CoInstaller stuff with dpinst to system before connecting device. This stuff has different versions for different windows versions and different versions for 32/64-bit os-s, so a lot of things needs to be carried with install package and installed depending on windows version. At least, it can be left un-signed as it is winxp/vista/7. In addition, at some point there was a windows phone inf file bound to whole winusb class, not just the excact windows phone devices, and this inf file is left behind on some machines, adding more confusion to this mess.
I have no experience with mac os.
All in all, the winusb solution can be made working quite well, but this requires a lot of work. Libusb without signed inf is no go. Cdc-acm without signed inf is no go. We can't still have nice things and the easiest way out is usb-serial converter, that has already had this pain handled.