Типичный способ справиться с этим - иметь объявление функции в файле общего заголовка, а затем иметь один файл cpp на платформу, который содержит различные определения этой функции для этой платформы. Тогда ваша система сборки создает и создает ссылки только в соответствующем платформенном файле cpp.
е
Filesystem.h
#include <string>
#include <vector>
int GetDirectoryFiles(std::string directory, std::vector<std::string> &files);
Filesystem_Windows.cpp:
#include "Filesystem.h"
int GetDirectoryFiles(std::string directory, std::vector<std::string> &files);
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind = FindFirstFile(directory.c_str(), &FindFileData);
...
return 0;
}
Filesystem_Linux.cpp:
#include "Filesystem.h"
int GetDirectoryFiles(std::string directory, std::vector<std::string> &files);
{
DIR *dp;
struct dirent *dirp;
...
return 0;
}
См. Дерево исходных текстов Qt, очень популярной кроссплатформенной библиотеки C ++, в качестве примера такой структуры.