If the functions are C functions, and you do not change the definition of any structures that are being passed there is no need to rebuild the app.
If the DLL exports C++ classes, then the importing module does need to be rebuilt - Even though the method signatures do not change, C++ class exporting is leaky: When allocating space for the class, there is no defined allocator function that is exported (by default) as such the importing module has to guess how much space to allocate, before the calling the (Exported) constructor. It builds that guess by parsing the classes definition.
The unfortunate consequence of this is, even if you are careful to only change a classes implementation details - even though the method signatures will remain the same and the dll will load successfully, the app will allocate the incorrect number of bytes when creating a new instance on the heap or stack.