【发布时间】:2019-06-21 10:40:08
【问题描述】:
我正在尝试设置一个简单的类,它既可以用作标题,也可以与 qmake 一起使用。如果构建是静态的,我会使用 .pro 文件中定义的宏“STATIC_BUILD”来控制。
foo.pro:
TEMPLATE = app
CONFIG += c++11
CONFIG += STATIC_BUILD
STATIC_BUILD {
DEFINES += STATIC_BUILD
}
SOURCES += \
main.cpp
HEADERS += \
foo.h
STATIC_BUILD {
SOURCES += \
foo.cpp
}
foo.h
#ifndef FOO_H
#define FOO_H
#ifndef STATIC_BUILD
#define MY_INLINE inline
#else
#define MY_INLINE
#endif
class Foo {
public:
Foo();
int getI() const;
void setI(int value);
private:
int i;
};
#ifndef STATIC_BUILD
#include "foo.cpp"
#endif
#endif // FOO_H
foo.cpp
#include "foo.h"
MY_INLINE Foo::Foo(){}
MY_INLINE int Foo::getI() const {
return i;
}
MY_INLINE void Foo::setI(int value) {
i = value;
}
main.cpp
#include <iostream>
#include "foo.h"
int main() {
Foo f;
f.setI(3);
std::cout << f.getI() << "\n";
return 0;
}
在 foo.pro 中注释“CONFIG += STATIC_BUILD”行并将类用作标题只能按预期工作。 如果我将此项目编译为静态(上面的行未注释),我会得到“Foo”成员的“未定义引用”。
我注意到,“CONFIG += STATIC_BUILD”没有评论,而是评论了这一行
#include "foo.cpp"
在 foo.h 中,一切正常(当然,仅适用于静态构建)。 这对我来说没有任何意义,因为“ifndef”的目的是不在静态构建中“编译”#include。
我做错了什么?
我在 linux 环境中使用带有 gcc 的 Qt 5.11。
【问题讨论】:
-
@VTT 这在我看来不像是骗子。这看起来更像是一个 qmake 错误。