VS2008: могу ли я создать проект с 2 файлами CPP с одинаковым именем в разных папках?

вот моя структура папок:

/
|
 -- program.cpp
 -- utility.h
 -- utility.cpp
|
 -- module/
    |
     -- utility.h
     -- utility.cpp

// Note that I have two files named utility.h and two named utility.cpp

при построении проекта я получаю ошибку ссылки (LNK2028: неразрешенный токен и так далее...) говорил, что некоторые символы не определены. Я подтвердил, что все символы определены и что все объявленные функции имеют соответствующее определение.

у меня такое чувство, что при компиляции моего проекта utility.cpp файлы из обеих папок компилируются в один и тот же utility.obj в папке output. В результате один переписывает другой.

  1. это ожидаемое поведение?
  2. как я создайте двоичный файл C++, который имеет два файлы с тем же именем (хотя в разные папки)?

6 ответов


Правой Кнопкой Мыши и/или .cpp файлов > properties>C/C++>Output Files>Object File Name > установить пользовательское имя. например, если оба файла называются MyFile.cpp в папке A и еще один в папке B, вы можете установить выходной AMyFile и BMyFile.

кроме того, вы также можете использовать макрос для префикса имен объектов с непосредственным именем родительской папки (т. е. с помощью $(IntDir)$(SafeParentName)$(SafeInputName)). Если этого недостаточно (например,A/B/MyFile.cpp и C/B/MyFile.cpp) и вы не прочь выпить объектные файлы, загромождающие ваше исходное дерево, вы также можете использовать $(InputDir)\ который поместит объектные файлы в ту же папку, что и исходный файл.

файлы cpp затем будут скомпилированы в два разных объектных файла..

наслаждайтесь!

обновление для VS2010: в VS2010 есть лучшее решение, проверьте его здесь. Спасибо n1ck ' s комментарий

btw, если содержимое имеет то же имя, вы разделяете их, используя разные пространства имен?

namespace A { // in folder A
    class CMyFile {};
};

namespace B{ // in folder B
    class CMyFile {};
};

// client.cpp
#include "A/MyFile.h"
#include "B/MyFile.h"
int main() {
    A::CMyFile aMyFile;
    B::CMyFile bMyFile;
    return 0;
}

я не знаю, имеет ли это значение, но это определенно яснее для человека: D


вы можете попробовать добавить в свое решение другой проект, который построит статический mudule.lib файл из вашего модуля .cpp .h, затем свяжите свой основной проект с этим lib. Он должен сделать VS для вывода .obj файлы в отдельном каталоге, и вы должны быть в состоянии связать без проблем.


вы действительно хотите два разных, но одноименных файла в одном проекте?


самая простая вещь, которая хорошо работает, - это конфликт .objs в разные подпапки (я использовал этот метод с 2003 и 2008) на основе исходных dirs.

например:

для src\gui\utils.cpp устанавливает " имя файла объекта "в".\Debug\gui/ " и для src\database\utils.cpp установил его в ".\Debug\database/".

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


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


Я не знаю цепочку компиляции VS.

, каждый .cpp сначала компилируется в a .файл obj. Связующие шаги объединяют их вместе.

Это очень распространено, чтобы положить все .obj-файлы в том же каталоге. Итак,как вы догадались, при компиляции второго стирается первый. Поэтому некоторые символы отсутствуют во время компиляции.

вероятно, есть вариант (опять же, я не работаю с VS), чтобы оставить .obj в том же каталоге, что и.СРР файл. Недостатком является некоторый мусор в дереве исходного кода.

мое личное мнение было бы рефакторингом.