Как скомпилировать исходный код отдельно в C++
Я надеюсь, что кто-то может помочь мне решить эту фундаментальную проблему, которую я пытался решить в течение последних двух недель.
У меня есть решение, которое содержит 4 проекта, некоторые библиотеки, от которых зависят файлы проекта. В каждый из этих проектов была включена копия файла logic.cpp, содержащая длинный список логики, который в псевдокодах выглядит следующим образом:
BOOL myLogic(){
if(...)
{
switch(...)
{
case 1:
doA();
break;
case 2:
doB();
break;
...
case 20:
doSomething();
break;
}
}
}
Для проекта #1 он создает исполняемый файл инструмента. В то время как для проекта № 2 он генерирует dll-версию инструмента, который я создаю, и другие 2 проекта, они действуют как служебные файлы для моего инструмента. Если вы заметили, что есть примерно 20 случаев, в которые может натолкнуться логика, и она довольно массивна.
Итак, моя проблема сейчас заключается в том, что все эти исходные коды компилируются в мой единственный exe или dll, даже если некоторые из этих случаев могут даже не быть достигнуты при развертывании в некоторых сценариях. Чего я хочу добиться, так это сломать этот случай переключения и скомпилировать 20 различных наборов exe и dll. Так
1) Приложение имеет меньшую площадь. 2) Источники могут быть защищены в определенной степени при обратном проектировании.
Следовательно, я хотел бы получить совет от сообщества о том, как мне решить эту проблему, если я все еще хотел бы продолжать использовать встроенную компиляцию Visual Studio. (Я мог бы собрать 20 комплектов exe и dll с помощью "Build Solution").
Спасибо, и я ценю любые советы. Не стесняйтесь уточнить, если я не был достаточно ясен в моем вопросе.
2 ответа
Создайте новый проект, который компилируется в статическую библиотеку. В этом проекте создайте отдельные исходные файлы cpp для всех 20 функций. (Разделение на большее количество исходных файлов просто для удобства обслуживания.) Разделите logic.cpp на 20 отдельных файлов. Если есть общие части кода, вы можете создать больше исходных файлов, которые будут содержать эти части.
Теперь создайте 2x20 новых проектов: 20 exe проектов и 20 dll проектов. Каждый из этих проектов зависит от проекта статической библиотеки, созданного на шаге 1, и все эти проекты - не что иное, как простая заглушка для вызова именно одной из функций из общей библиотеки.
При создании решения у вас будет 20 исполняемых файлов с разными именами и 20 библиотек с разными именами для каждой функции. Если в компоновщике включено устранение мертвого кода, то ни один из exes/dll не будет содержать код, который не требуется для конкретной функции.
Как насчет ручной работы? Приведите некоторые определения для ваших сценариев или используйте некоторые стандартные, такие как "_ISDLL", и включите в них случаи:-), из которых вы знаете, что они недоступны в "#ifdefs"
#ifdef _ISDLL
case x:
break;
#endif