VisualStudio проект с несколькими исходными файлами с тем же именем?

У меня большой проект C++, с исходными файлами, организованными в несколько папок (в файловой системе).

в двух из этих папок у меня есть файлы с одинаковыми именами. например

\MyProject\foo\Blurp.cpp
\MyProject\foo\File.cpp
\MyProject\bar\File.cpp
\MyProject\bar\Knoll.cpp

проект кроссплатформенный, и я использую autoconf на linux и OSX, но должен использовать MSVC на W32 (из-за некоторых сторонних библиотек C++, которые я использую на W32, и несовместимости двоичного интерфейса C++ между компиляторами)

на стороне MSVC проект также организован в несколько "фильтров" (тех виртуальных папок) (имена которых примерно соответствуют каталогам, в которых находятся файлы), так что я могу их различать.

Теперь проблема в том, что когда я собираю проект, MSVC помещает объектные файлы в единую плоскую директорию, и я получаю:

\MyProject\Release\Blurp.obj
\MyProject\Release\File.obj
\MyProject\Release\Knoll.obj

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

Есть ли способ указать MSVC создавать объектные файлы с уникальным именем в зависимости от каталогов (или фильтров), в которых эти файлы живут?

я представляю что-то вроде:

\MyProject\Release\foo\Blurp.obj
\MyProject\Release\foo\File.obj
\MyProject\Release\bar\File.obj
\MyProject\Release\bar\Knoll.obj

или же

\MyProject\Release\foo-Blurp.obj
...

или что угодно. все другие известные мне системы сборки (CMake, autotools) могут работать с несколькими файлами с одинаковыми именами.

этот вопрос похож на 3729515, но в настоящее время я застрял на VS2008. (решение, предложенное там для VS2008 - установить Object-Directory для каждого рассматриваемого файла - это то, что действительно работает теоретически, но я бы хотел избежать по практическим соображениям)

2 ответа

Решение

Вы можете установить настройки проекта для одного или обоих файлов, которые конфликтуют, и установить для свойства "Имя файла объекта" значение:

$(InputDir)\$(IntDir)\

Просто щелкните правой кнопкой мыши имя файла вместо имени проекта, чтобы установить свойство только для этого файла.

Например, если вы делаете это для \MyProject\foo\File.cpp тогда объектный файл для этого исходного файла перейдет в \MyProject\foo\Release\File.obj поэтому он не будет конфликтовать с объектным файлом для \MyProject\bar\File.cpp,

Недостатки этого метода в том, что он может загромождать ваше исходное дерево выходными данными компилятора (но, надеюсь, их не так уж много), и, что еще хуже, параметры проекта, относящиеся к конкретному файлу, имеют тенденцию забываться / скрываться, так как они не вызываются в IDE на всех. Если когда-нибудь в будущем вам (или кому-то еще) понадобится что-то изменить, может быть довольно загадкой, почему сборка ведет себя так странно для определенных файлов, пока кто-то не возится с ней полдня, пока не узнает, что происходит на.

Я лично предпочел бы, чтобы настройка проекта $(InputDir)\$(IntDir)\ приведет к тому, что объектные файлы перейдут в каталоги относительно исходного файла, но на самом деле это не совсем хорошо работает в качестве настройки уровня проекта. В этом случае VS все еще только устанавливает выходной каталог один раз, и это заканчивается относительно первого исходного файла в списке. Тогда компоновщик запутывается в том, где он должен искать объектные файлы.

Может быть, вы можете установить "имя файла объекта" в рамках проекта (Свойства конфигурации->C/C++-> Выходные файлы) в

$(IntDir)%(RelativeDir)

который использует относительную исходную папку исходных файлов. Обратите внимание %, но это становится уродливым, если ваши исходные файлы находятся вне директории вашего проекта, содержащей ..\

Использовать

$(IntDir)%(Directory)

как "Путь к объектному файлу".

%(Directory)содержит абсолютный путь к файлу без тома и без самого имени файла. Это решение должно работать как минимум в VS 2019 и может применяться к проекту напрямую.

Другие вопросы по тегам