VS2008: Могу ли я создать проект с двумя CPP-файлами с одинаковым именем в разных папках? - PullRequest
8 голосов
/ 17 февраля 2010

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

/
|
 -- 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 в выходной папке. В результате один перезаписывает другой.

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

Ответы [ 6 ]

12 голосов
/ 17 февраля 2010

Щелкните правой кнопкой мыши оба / любой из .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 комментарий

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

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

2 голосов
/ 17 февраля 2010

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

1 голос
/ 28 декабря 2010

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

Например:

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

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

1 голос
/ 17 февраля 2010

Вы действительно ХОТИТЕ два разных файла с одинаковыми именами в одном проекте?

0 голосов
/ 17 февраля 2010

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

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

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

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

Мое личное мнение - рефакторинг.

0 голосов
/ 17 февраля 2010

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

...