2017-02-02 17 views
1

서로 종속 된 여러 Qt 프로젝트가 있습니다. 두 프로젝트는 다른 목적 (즉, 주요 응용 프로그램과 단위 테스트)을 가진 실행 파일을 빌드하고 동일한 라이브러리에 의존합니다. 그러나 이러한 라이브러리는 유닛 테스트를 빌드 할 때 다른 컴파일러 설정으로 컴파일해야합니다. 그래서 내 응용 프로그램에 컴파일러 플래그 집합이 필요하고이 플래그 집합도 라이브러리를 컴파일 할 때 기본값이어야한다고 가정합니다. 내 유닛 테스트 애플 리케이션은 컴파일 될 때 라이브러리가 설정되도록 컴파일러 플래그의 또 다른 세트 (또는 추가 세트)를 필요로한다.qmake에 컴파일러 옵션이 추가 된 추가 메이크 파일 타겟

qmake를 한 번 실행 한 다음 결과 메이크 파일을 사용하여 별도의 실행에서 두 앱의 라이브러리를 컴파일 할 수 있도록 qmake *.pro 파일을 작성하려면 어떻게해야합니까? 나는 디폴트를 가지고 있다고 생각했는데 debugrelease은 'default'플래그를 가지고 있고 추가 타겟은 test으로 단위 테스트를 위해 만들었지 만, 어떻게해야 할지를 알 수 없었다. 나는 Qt 4.8에 붙어있다.


일부 배경 : 저는 C++로 프로그래밍 중이며 라이브러리에 정의 된 클래스에 대한 일부 모의 객체를 만들어야합니다. 그러나이 클래스는 virtual 메서드를 포함하지 않으므로 단위 테스트 용으로 컴파일 할 때 virtual으로 정의되고 그렇지 않으면 비어있는 전 처리기 플래그를 추가했습니다. 이렇게하면 모의 객체의 메소드를 덮어 쓸 수 있지만 릴리즈 빌드에서 가상 함수 호출의 오버 헤드가 발생하지 않습니다.

답변

0

내 솔루션이 도움이 될 수 있습니다. make-file을 사용하여 나의 전환 프로젝트 파일을 만듭니다. 먼저 프로그램에 맞는 간단한 메이크 : 내 프로젝트 트리에서 프로그램을 만드는 예

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 
} 
이것과 함께

나는 조용한 간단한 메이크 파일을 생성합니다. 전체 프로젝트 빌드는 프로젝트 트리 위에 하나의 makefile로 완료됩니다.

아마도 도움이 될 것입니다 ...