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. В результате один переписывает другой.
- это ожидаемое поведение?
- как я создайте двоичный файл 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 в том же каталоге, что и.СРР файл. Недостатком является некоторый мусор в дереве исходного кода.
мое личное мнение было бы рефакторингом.