Игнорировать отсутствующие файлы .obj или «/ P переключатель + внешний инструмент + линкер = ад» - PullRequest
1 голос
/ 28 мая 2011

Я пытаюсь выполнить настройку, как описано в моем предыдущем вопросе: Есть ли способ проанализировать предварительно обработанный источник с помощью внешнего инструмента перед его компиляцией?

Все мои файлы .cpp настроены на компиляцию с / p, который генерирует .i (предварительно обработанные) файлы для всех из них, но без объектных файлов. Эти сгенерированные файлы .i также добавляются в мой проект, и для моего инструмента устанавливается опция внешнего инструмента сборки, которая изменяет эти файлы и сохраняет их под новым расширением .obfuscated.cpp. Все эти файлы .obfuscated.cpp также добавляются в проект и настраиваются для нормальной компиляции, создавая объектные файлы.

Теперь проблема в том, что Visual Studio (или компоновщик, кто-то из них) по какой-то причине хочет получить файлы obj как из файлов .cpp (которые теперь просто сохраняются в файлы .i, без создания объектных файлов), так и из .obfuscated.cpp (которые создаются нормально).

Я бы предположил, что компоновщику не потребуются файлы .obj из источников, которые настроены для компиляции с параметром / P, поскольку этот параметр предотвращает создание объектных файлов.

Теперь я вижу только два пути решения этой проблемы: 1) Выполните сборку в два этапа. В первом случае убедитесь, что все файлы .cpp предварительно обработаны и сохранены в файлы .i. Эту сборку не нужно завершать, нужно только сохранить .i файлы. Затем, после этого, я выбираю все файлы .cpp и устанавливаю для них «Исключить из сборки», затем все компилируется так, как должно. 2) Вместо добавления файлов в проект и использования опции внешнего инструмента сборки, вместо этого сделайте шаг предварительной ссылки, на котором мой собственный инструмент автоматически найдет все файлы .i (может принять все * .i в определенном каталоге ), обработайте их в * .obfuscated.cpp, а затем вручную вызовите cl.exe для всех этих файлов для создания объектных файлов, переименуйте их в собственные имена (чтобы компоновщик считал, что они являются объектными файлами, созданными из оригинальных источников) и поместите в промежуточный каталог. Но в этом случае мне придется отслеживать все аргументы компилятора и изменять их соответственно, если что-то изменится в моем проекте ... Оба эти решения кажутся не слишком удачными. Есть ли другой способ сделать это в Visual Studio? Разве я не могу просто сказать компоновщику игнорировать отсутствующие файлы .obj? (Все символы будут найдены в любом случае ...)

1 Ответ

1 голос
/ 28 мая 2011

может быть, это может вам помочь: вместо расширения .obfuscated.cpp дайте ему более простое расширение, например .icpp, и добавьте эти .icpp файлы (после первой компиляции) в ваш проект (в отдельной папке в вашем проекте), затем для каждого из этих файлов .icpp перейдите на их страницу свойств и задайте правильный инструмент сборки (компилятор C \ C ++), а ваши файлы .obj сохранят ту же часть имени, что и исходные файлы .cpp, поэтому ссылки должны автоматически быть сделано правильно.

...