Как настроить qmake для сохранения * .obj в подкаталогах? - PullRequest
0 голосов
/ 29 сентября 2018

У меня проблема с конфигурацией сборки. Я получаю ошибку 'LNK2019':

main.obj: -1: ошибка: LNK2019: неразрешенный внешний символ "public: __cdecl Reference :: Item ::Item (void) "(?? 0Item @ Object @@ QEAA @ XZ), на который ссылается функция main

Структура файловой системы для моего проекта выглядит следующим образом (World.pro):

SOURCES += \
        main.cpp \
        Window.cpp \
    Item.cpp \
    Object/Item.cpp \
    Reference/Item.cpp

HEADERS += \
        Window.h \
    Item.h \
    Object/Item.h \
    Reference/Item.h

Я знаю, где проблема.В настоящее время компилятор сохраняет выходные файлы в одном основном каталоге, следовательно, будет 3 файла с одинаковыми именами (в настоящее время они перезаписаны?), Поэтому компоновщик не может найти нужные файлы.Как попросить компилятора любезно сохранить * .obj в соответствующих подкаталогах 'Object', 'Reference' и сообщить компоновщику, где искать эти файлы?

Я не хочу, чтобы отдельный проект был подпроектом (библиотеками).).Я доволен текущей структурой файловой системы.Также для меня идеально подходит преобразование имен, мне нравится ссылаться на типы по Object::Item и Reference::Item.

1 Ответ

0 голосов
/ 30 сентября 2018

Не уверен, что вы можете настроить систему сборки qmake, так как при чтении документа http://doc.qt.io/qt-5/qmake-variable-reference.html#objects-dir здесь не похоже, что у вас есть какая-либо возможность определить конкретные папки для исходного каталога.

Для меняЭто плохая практика - иметь файлы с одинаковым именем в одном проекте.Это только приводит к путанице.

Похоже, вы путаете имена файлов и пространства имен:

Вы можете очень хорошо получить один и тот же результат с разными именами файлов (Reference / ReferenceItem.h), потому что, как вы называетеклассы в C ++ не связаны с именем файла, это всего лишь соглашение (иметь класс Foobar в файле Foobar.h / .cpp)

=> Вы можете иметь два класса с одинаковым именем, если онине в том же пространстве имен.Имя файла не влияет на него.

Файл Reference / ReferenceItem.h

namespace reference {
  class Item {
   //implementation here...
  }
}

Объект / ObjectItem.h

namespace object {
  class Item {
   //implementation here...
  }
}
...