我有一个使用两个库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
答案 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...