Это, конечно, не может быть тот же двоичный файл: общий формат объектов ELF в Linux, формат DLL "PE" в Windows. А динамическая загрузка имеет разную семантику в обеих системах. Подробности см. В компоновщике и загрузчике Levine .
Если вы все сделаете аккуратно, у вас может быть один и тот же исходный код, дающий два разных файла (DLL в Windows, динамический общий объект в Linux).
Но вам, вероятно, понадобятся некоторые условные приемы компиляции, такие как #ifdef WINDOWS
и т.д ...
Вы можете использовать библиотеки, предоставляющие вам общую абстракцию для таких вещей. Например, и GTK / Glib, и Qt имеют некоторый механизм, дающий общую абстракцию динамически связанных (или динамически загружаемых - т.е. dlopen -ed) библиотек.
Возможно, вы хотите прочитать Руководство по библиотеке программ (по крайней мере, для Linux).