在#include预处理程序命令中使用qmake变量

时间:2019-02-12 14:12:59

标签: c++ qt qmake preprocessor

我有一个使用两个库lib1和lib2的项目coreApp。

每个库都有一个文件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

我想在coreApp的main.cpp中执行以下操作:

#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 :(得分:1)

  

有可能吗?

是的,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...