2017-02-02 14 views
1

У меня есть несколько проектов Qt с зависимостями друг от друга. Два проекта создают исполняемые файлы с различными целями (а именно мое основное приложение и модульные тесты) и зависят от тех же библиотек. Однако эти библиотеки необходимо скомпилировать с различными настройками компилятора при сборке для моих модульных тестов. Поэтому предположим, что моему приложению нужен набор флагов компилятора, и этот набор флагов также должен быть по умолчанию при компиляции библиотек. Моему модульному тестовому приложению требуется другой набор (или просто дополнительный набор) флагов компилятора для библиотек, которые будут установлены при компиляции.Дополнительная цель makefile с добавленной опцией компилятора в qmake

Как я могу написать файлы qmake *.pro, чтобы я мог запускать qmake один раз, а затем использовать полученный файл make для компиляции библиотек для обоих приложений в отдельных прогонах make? Я думал о том, что по умолчанию заданы цели debug и release с флагами «по умолчанию» и дополнительной целью test, чтобы строить для моих модульных тестов, но я, похоже, не могу понять, как это сделать. Я застрял с Qt 4.8.


Некоторые предпосылки: Я программирую на C++ и вам нужно создать некоторые макеты для классов, определенных в библиотеках. Эти классы, однако, не содержат методов virtual, поэтому я добавил флаг препроцессора, который при компиляции для модульных тестов получает значение virtual и в противном случае пуст. Таким образом, я могу перезаписывать методы в своих макетных объектах, но не испытываю накладных расходов на вызовы виртуальных функций в сборках релизов.

ответ

0

Может быть, мое решение работает для вас. Я создаю свои переадресации pro-Files с 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 "\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-файла поверх дерева проектов .

Возможно, это поможет ...