У меня есть несколько проектов Qt с зависимостями друг от друга. Два проекта создают исполняемые файлы с разными целями (а именно, мое основное приложение и модульные тесты) и зависят от одних и тех же библиотек. Эти библиотеки, однако, должны быть скомпилированы с другими настройками компилятора при сборке для моих модульных тестов. Поэтому предположим, что моему приложению нужен набор флагов компилятора, и этот набор флагов должен также использоваться по умолчанию при компиляции библиотек. Моему приложению модульного тестирования нужен другой набор (или просто дополнительный набор) флагов компилятора для библиотек, которые должны быть установлены при их компиляции.
Как я могу написать qmake *.pro
файлы, чтобы я мог запустить qmake один раз, а затем использовать полученный make-файл для компиляции библиотек для обоих приложений в отдельных запусках make? Я думал о том, чтобы сделать цели по умолчанию debug
а также release
с флагами «по умолчанию» и дополнительной целью test
строить для моих модульных тестов, но я не могу понять, как это сделать. Я застрял с Qt 4.8.
Немного предыстории: я программирую на C ++ и мне нужно создать несколько фиктивных объектов для классов, определенных в библиотеках. Эти классы, однако, не содержат virtual
методы, поэтому я добавил флаг препроцессора, который определяется virtual
при компиляции для юнит-тестов и пусто в противном случае. Таким образом, я могу перезаписывать методы в моих фиктивных объектах, но не испытываю издержек при вызовах виртуальных функций в сборках релизов.
Может быть, мое решение работает для вас.
Я создаю свои профильные файлы с помощью make-file (s).
Пример создания программы в дереве моего проекта:
Сначала более простая подгонка make-файла к программе:
SHELL = /bin/bash
BUILD_PATH := $(shell cd ../../../; pwd)
CONF_PATH := $(BUILD_PATH)/sources/config
BIN_PATH := $(BUILD_PATH)/bin
LIB_PATH := $(BUILD_PATH)/lib
INS_PATH := /usr/local
MODULES := core gui widgets printsupport
TARGET := CCDDataDisplay
TEMPLATE := app
DEFINES :=
INCLUDES := $(BUILD_PATH)/sources/include
LIBS := -L$(LIB_PATH) -lhrlLib
DESTDIR := $(BIN_PATH)
MOCS := MainWindow.h
include $(CONF_PATH)/conf_qmake.mk
conf_qmake.mk:
QMAKE := qmake-qt5
HEADERS := $(wildcard *.h)
C_SOURCES := $(wildcard *.c)
CPP_SOURCES := $(wildcard *.cpp)
SOURCES := $(C_SOURCES)
SOURCES += $(CPP_SOURCES)
FORMS := $(wildcard *.ui)
.PHONY: all
all: depdirs
@echo -e "\n\x1b[32;01m Building \x1b[34;01m$(TARGET)\x1b[32;01m in $(shell pwd) ... \x1b[0m"@if [ ! -d .build ]; \
then \
rm -f qmake.pro; \
cp $(CONF_PATH)/qmake.pro qmake.pro;\
mkdir -p .build; \
cd .build; \
$(QMAKE) -makefile "MODULES_IN=$(MODULES)" \
"TARGET_IN=$(TARGET)" \
"TEMPLATE_IN=$(TEMPLATE)" \
"DEFINES_IN=$(DEFINES)" \
"INCLUDES_IN=$(INCLUDES)" \
"LIBS_IN=$(LIBS)" \
"DESTDIR_IN=$(DESTDIR)" \
"SOURCES_IN=$(SOURCES)" \
"MOCS=$(MOCS)" \
"FORMS_IN=$(FORMS)" \
../qmake.pro >> /dev/null; \
fi;
@$(MAKE) -s -C .build;
.PHONY: depdirs
depdirs:
@$(foreach dir, $(DEPDIRS), $(MAKE) -s -C $(dir);)
.PHONY: install
install:
@$(MAKE) -s -C .build install;
.PHONY: realclean clean distclean
clean:
@if [ -d .build ]; then $(MAKE) -s -C .build clean; fi
@$(RM) *~;
@$(RM) $$(BUILD_PATH)/include/*~;
realclean:
@$(RM) -r .build;
@$(RM) qmake.pro;
@$(RM) *~;
@$(RM) $(BUILD_PATH)/include/*~;
distclean: realclean
@$(RM) $(BUILD_PATH)/bin/$(TARGET);
@$(RM) $(BUILD_PATH)/lib/lib$(TARGET)*;
и последний qmake.pro:
QT += $$MODULES_IN
TARGET = $$TARGET_IN
TEMPLATE = $$TEMPLATE_IN
CONFIG += staticlib
DEFINES += $$DEFINES_IN
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
INCLUDEPATH += $$INCLUDES_IN
LIBS += $$LIBS_IN
DESTDIR = $$DESTDIR_IN
SOURCES += $$SOURCES_IN
HEADERS += $$MOCS
FORMS += $$FORMS_IN
unix {
target.path = /usr/local
INSTALLS += target
}
с этим у меня есть только тихие простые make-файлы для генерации.
Вся сборка проекта выполняется с помощью одного make-файла поверх
дерево проекта.
Может быть, это помогает …
Других решений пока нет …