qmake中添加了编译器选项的附加makefile目标

Additional makefile target with added compiler option in qmake

本文关键字:makefile 目标 选项 添加 编译器 qmake      更新时间:2023-10-16

我有几个彼此依赖的Qt项目。两个项目构建具有不同用途的可执行文件(即我的主应用程序和单元测试),并且依赖于相同的库。然而,在为我的单元测试构建时,这些库需要使用不同的编译器设置进行编译。因此,假设我的应用程序需要一组编译器标志,并且在编译库时,这组标志也应该是默认的。我的单元测试应用程序需要另一组(或者仅仅是一组额外的)编译器标志,以便在编译库时对其进行设置。

如何编写qmake*.pro文件,以便运行qmake一次,然后使用生成的makefile在单独运行make时编译两个应用程序的库?我想让默认的make目标debugrelease带有"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
}

有了这个,我只有安静的简单生成文件。整个项目构建是在项目树。

也许这有帮助。。。