After re-reading your question, I re-edited my answer.
Dissecting your colleague arugments
If he believes that splitting your code into shared libraries will improve code modularity, testability and reuse, then I guess that this means he believes you have some problems with your code, and that enforcing a "shared library" architecture will correct it.
Modularity?
Your code must have undesired interdependencies that would not have happened with a cleaner separation between "library code" and "code using library code".
Now, this can be achieved through static libraries, too.
Testing?
Your code could be tested better, perhaps building unit tests for each separate shared library, automated at each compilation.
Now, this can be achieved through static libraries, too.
Reuse of code?
Your colleague would like to reuse some code that is not exposed because hidden in the sources of your monolithic application.
Conclusion
The points 1 and 2 can still be achieved with static libraries. The 3 would make shared libraries mandatory.
Now, if you have more than one depth of library linking (I'm thinking about linking together two static libraries which alread were compiled linking the other libraries), this can be complex. On Windows, this leads to error to link as some functions (usually the C/C++ runtime functions, when linked with statically) are referenced more than once, and the compiler can't choose which function to call. I don't know how this work on Linux, but I guess this could happen, too.
Dissecting your own arguments
Your own arguments are somewhat biased:
Burden of compilation/linking of shared libraries?
The burden of compiling and linking to shared libraries, compared to compiling and linking to static libraries is non-existent. So this argument has no value.
Dynamicaly loading/unloading?
Dynamically loading/unloading a shared library could be a problem in a very limited use case. In normal cases, the OS loads/unloads the library when needed without your intervention, and anyway, your performance problems lie elsewhere.
Exposing C++ code with C interfaces?
As for using a C-function interface for you C++ code, I fail to understand: You already link together static libraries with C++ interface. Linking shared libraries is no different.
You would have a problem if you had different compilers to produce each libraries of your application, but this is not the case, as you already link statically your libraries.
A single file binary is easier?
You're right.
On Windows, the difference is negligible, but then, there is still the problem of DLL-Hell, which disappears if you add the version to your library names or work with WinXP.
On Linux, in addition to the Windows problem above, you have the fact that by default, the shared libraries need to be in some system default directories to be useable, so you'll have to copy them there at install (which can be a pain...) or change some default environment settings (which can be a pain, too...)
Conclusion: Who is right?
Now, your problem is not "is my colleague is right ?". He is. As you are, too.
Your problem is:
- What do you really want to achieve?
- is the work necessary for this task worth it?
The first question is very important, as it seems to me that your arguments and your colleague's arguments are biased to lead to the conclusion that seems more natural for each of you.
Put it in another wording: Each of you already know what the ideal solution should be (according to each viewpoint) and each of you stacks up arguments to reach this solution.
There is no way to answer that hidden question...
^_^