Ошибка «no rule to make target…» с недокументированными файлами (glob)

Вопрос:У меня есть один проект, в который включены все мои файлы .h и .cpp. Этот проект создает мое приложение. В другом проекте есть все мои модульные тесты, для которых в качестве первого проекта требуются те же файлы .h и .cpp. Поэтому каждый раз, когда я добавляю новый файл в свой первый проект, я должен добавить

Вопрос:

У меня есть один проект, в который включены все мои файлы .h и .cpp. Этот проект создает мое приложение. В другом проекте есть все мои модульные тесты, для которых в качестве первого проекта требуются те же файлы .h и .cpp. Поэтому каждый раз, когда я добавляю новый файл в свой первый проект, я должен добавить его ко второму проекту, поэтому я попытался автоматизировать этот шаг.
Для этого я попытался использовать функцию qmake для файлов (glob), которая выглядит в основном так:

HEADERS += someotherstuff.h files(../Core/DriveProgramInterface/*.h) files(../Core/DriveProgramWizard/*.h) SOURCES += someotherstuff.cpp files(../Core/*.cpp) files(../Core/DriveProgramInterface/*.cpp) files(../Core/DriveProgramWizard/*.cpp)

Итак, хотя он хорошо работает с заголовками, он вообще не работает с источниками. Когда я пытаюсь скомпилировать, я получаю следующую ошибку:

Нет правил для создания целевых файлов (../Core/DriveProgramWizard/.cpp), необходимых для ‘debug/.o’. Стоп

Итак, я посмотрел на свой MakeFile, и я нашел это:

SOURCES = someotherstuff.cpp files(..Core*.cpp) files(..CoreDriveProgramInterface*.cpp) files(..CoreDriveProgramWizard*.cpp) OBJECTS = someotherstuff.cpp debug/*.o debug/*.o debug/*.o

Итак, я думаю, может быть, проблема в том, что glob не разрешен в MakeFile, но вместо этого он пытается сгенерировать *.o файлы. Я действительно не совсем уверен, если это правильно, поэтому, если есть еще одна причина, почему это не работает, не стесняйтесь указать мне на нее.
Кроме того, если у вас есть предложения, как я мог бы сделать эту работу (с функцией files() или без нее, я не забочусь), я был бы очень благодарен.

Лучший ответ:

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

Итак, я предлагаю изменить вашу строку SOURCES следующим образом:

SOURCES += someotherstuff.cpp SOURCES += ../Core/*.cpp SOURCES += ../Core/DriveProgramInterface/*.cpp SOURCES += ../Core/DriveProgramWizard/*.cpp Ответ №1

В некоторых случаях просто добавление: SOURCES += ../OtherDir/*.cpp не работает и работает сгенерированный Makefile жалуется, что:

No rule to make target ‘/../OtherDir/*.cpp’, needed by ‘release/*.o’ [or ‘debug/*.o’]

В таком случае решение состоит в том, чтобы обернуть $$qoute($$PWD/…) вокруг путей, которые имеют wild card *:

SOURCES += $$quote($$PWD/../OtherDir/*.cpp) HEADERS += $$quote($$PWD/../OtherDir/*.h)

Таким образом создается рабочий Makefile и сборка выполнена успешно.

Я думаю, что одним из случаев является добавление *.cpp/*.h к подпроекту, который вложен в суперпроект (т.е. проект с TEMPLATE=subdir в файле проекта .pro).

Это также может помочь, отметив, что я работаю на платформе Windows/MinGW32, и проблема может быть связана с этой платформой.

Оцените статью
Добавить комментарий