qmake - изменения в конфигурации не обнаруживаются и библиотека не перекомпилируется - PullRequest
0 голосов
/ 08 января 2019

Я хочу выбрать файлы, которые скомпилированы в статическую библиотеку на основе конфигурации.

Для этого я создал две конфигурации (A и B) на вкладке Projects в QtCreator, и в моем файле .pro у меня есть

CONFIG(USE_A){
    SOURCES += My_lib_a.cpp
}
CONFIG(USE_B){
    SOURCES += My_lib_b.cpp
}

и это работает, но есть проблема.

Когда я переключаюсь между конфигурациями A и B пару раз, после того, как обе эти версии были построены , qmake не обнаруживает, что произошли изменения, и библиотека застрял со старым файлом . Я вынужден либо дотронуться до файла, который я хочу перекомпилировать, либо вручную перестроить библиотеку.

Я проверил на Qt 5.12 и msvc 2017, но мне нужно, чтобы это работало на Windows и Linux.

Это правильный способ сделать это? Есть ли способ преодолеть эту проблему?

Минимальный пример:

// example/top.pro
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS += \
    my_lib\
    app

// example/app/app.pro
TARGET = app
SOURCES += main.cpp
INCLUDEPATH += ../my_lib
DEPENDPATH += ../my_lib
LIBS += -L../my_lib/debug -lmy_lib
PRE_TARGETDEPS += ../my_lib/debug/my_lib.lib

// example/app/main.cpp
#include "My_lib.h"
int main()
{
    My_lib m;
}

// example/my_lib/my_lib.pro
TARGET = my_lib
TEMPLATE = lib
CONFIG += staticlib
CONFIG(USE_A){
    SOURCES += My_lib_a.cpp
}
CONFIG(USE_B){
    SOURCES += My_lib_b.cpp
}
HEADERS += My_lib.h

// example/my_lib/My_lib.h
#pragma once
struct My_lib
{
    My_lib();
};

// example/my_lib/My_lib_a
#include "My_lib.h"
#include <iostream>
My_lib::My_lib()
{
    std::cout << "This is A" << std::endl;
}

// example/my_lib/My_lib_b
#include "My_lib.h"
#include <iostream>
My_lib::My_lib()
{
    std::cout << "This is B" << std::endl;
}

1 Ответ

0 голосов
/ 08 января 2019

Поскольку вы собираете библиотеку в одном и том же каталоге сборки с тем же целевым именем, вы всегда будете получать последний собранный файл, независимо от того, какая текущая конфигурация сборки установлена. Чтобы решить эту проблему, вам нужно использовать отдельные каталоги сборки, по одному для каждой конфигурации.

В Настройки сборки , для каждой конфигурации , добавьте %{CurrentBuild:Name} в конце Каталог сборки Путь:

/somepath/example/%{CurrentBuild:Name}

Очистите текущий каталог сборки, затем соберите каждую конфигурацию заново. Учитывая A и B имена вашей конфигурации, вы должны получить дерево каталогов, подобное этому:

- somepath 

  - example

    - A                         
      + app
      + my_lib

    - B                         
      + app
      + my_lib
...