我有几个彼此依赖的Qt项目。两个项目构建具有不同用途的可执行文件(即我的主应用程序和单元测试),并且依赖于相同的库。然而,在为我的单元测试构建时,这些库需要使用不同的编译器设置进行编译。因此,假设我的应用程序需要一组编译器标志,并且在编译库时,这组标志也应该是默认的。我的单元测试应用程序需要另一组(或者仅仅是一组额外的)编译器标志,以便在编译库时对其进行设置。
如何编写qmake*.pro
文件,以便运行qmake一次,然后使用生成的makefile在单独运行make时编译两个应用程序的库?我想让默认的make目标debug
和release
带有"default"标志,并为我的单元测试构建一个额外的目标test
,但我似乎不知道如何做到这一点。我被问题4.8卡住了。
一些背景:我正在用C++编程,需要为库中定义的类创建一些mock对象。然而,这些类不包含virtual
方法,所以我添加了一个预处理器标志,该标志在为单元测试编译时定义为virtual
,否则为空。通过这种方式,我可以覆盖mock对象中的方法,但在发布版本中不会遇到虚拟函数调用的开销。
也许我的解决方案适合您。我用make文件创建了我的分流专业文件。在我的项目树中创建程序的示例:首先,一个更简单的makefile适合程序:
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 "nx1b[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
}
有了这个,我只有安静的简单生成文件。整个项目构建是在项目树。
也许这有帮助。。。