Используйте переменную qmake в команде препроцессора #include - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть проект coreApp, использующий две библиотеки lib1 и lib2.

У каждой библиотеки есть файл Version.h , указывающий версию библиотеки, каждая в пространстве имен библиотеки , пример:

namespace lib1{
    static const QString Version = "1.2";
}

В моем coreApp .pro у меня есть:

LIB1_PATH_VAR = $$(LIB1_PATH) (LIB1_PATH is an environment variable storing the path to the root directory of lib1)
LIBS += -L$$LIB1_PATH_VAR/bin/ -l1
LIB2_PATH_VAR = $$(LIB2_PATH)
LIBS += -L$$LIB2_PATH_VAR/bin/ -l2

Я хочу сделать что-то подобное в моем main.cpp coreApp:

#include "$$LIB1_PATH_VAR/Version.h"
#include "$$LIB2_PATH_VAR/Version.h"

std::cout<<lib1::Version<<std::endl;
std::cout<<lib2::Version<<std::endl;

Это позволило бы мне быть независимым от пути к библиотеке (в коде) при использовании классов с одинаковыми именами в обеих библиотеках (здесь Version.h).

Возможно ли это?

Текущее решение:

INCLUDEPATH += LIB1_PATH/..

для моего coreApp.pro Чтобы мой main.cpp мог выглядеть так:

#include "path/to/lib1/Version.h"
#include "path/to/lib2/Version.h"

std::cout<<lib1::Version<<std::endl;
std::cout<<lib2::Version<<std::endl;

Проблема в том, что путь к библиотеке записан в коде, и если я перемещаю библиотеку в другое место, мне нужно изменить все мои #include в коде

1 Ответ

0 голосов
/ 12 февраля 2019

Возможно ли это?

Да, qmake поддерживает такую ​​предварительную обработку, используя QMAKE_SUBSTITUTES.Какой-то глупый пример кода:

my.pro

mysubst.input = myfile.cpp.in
mysubst.output = myfile.cpp
QMAKE_SUBSTITUTES += mysubst

myfile.cpp.in

// all $$<expr> stuff is properly evaluated and substituted;
// !!IF / !!ELIF / !!ELSE / !!ENDIF processed as expected;
// quotes and backslashes must be escaped;
// anything else is passed through

#include <iostream>
!!IF !isEmpty(some_var)
#include \"$${some_var}\"
!!ENDIF
// more c++ code...
...