В моем случае у меня есть два уровня, скажем, базовый уровень и прикладной уровень.
Прикладной уровень зависит от основного уровня.
Я хочу, чтобы только основной слой использовал функции CRT.
На прикладном уровне, если используется какая-либо функция CRT, она не должна компилироваться.
Есть ли способ добиться этого?
Например, прямой вызов free / malloc не должен выполняться на прикладном уровне.
Один из способов, который я подумал, #define все функции CRT к некоторой ошибке, так что прикладной уровень не может использовать прямые вызовы CRT (прикладной уровень включает заголовочные файлы основного уровня).
Вам не нужно # определять все функции в CRT. Достаточно определить одну из функций, объявленных в заголовке, чтобы вызвать ошибку компиляции.
Кроме того, посмотрите на заголовки CRT, большинство из них полагаются на какую-то конструкцию такого рода:
#ifndef "some unique id"#define "some unique id"/* header body */
#endif
Если вы определите этот уникальный идентификатор, вы фактически заставите заголовок не включаться, поэтому при попытке использовать функцию, объявленную в этом заголовке, произойдет ошибка компиляции.
Предполагая, что все ваши проекты являются родными C или C ++, я считаю, что удаления ссылок на двоичные файлы CRT Windows должно быть достаточно. Если кто-то попытается использовать их, они получат ошибки ссылки.
Для DLL откройте свойства проекта (из Visual Studio), затем перейдите к Configuration Properties->Linker->Input
и установить Ignore All Default Libraries
в Yes (/NODEFAULTLIB)
, Прямо над этим установите Additional Dependencies
только библиотеки из вашего решения, которые вам нужны.
Для статической библиотеки перейдите в Librarian->General
и сделай то же самое.