【问题标题】:Header-only and static build with QMake使用 QMake 的仅标头和静态构建
【发布时间】: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 错误。

标签: c++ qmake


【解决方案1】:

这是一个已知的 QMake 错误,报告了几次:

(警告:第三次错误报告中出现不必要的攻击性语言)

简而言之,为在 #include 指令中提到的“源文件”跳过构建的机制不够聪明,无法考虑是否会实际执行 #include 指令(也就是说,它不会不知道预处理器条件)。

【讨论】:

  • 我认为他们最好分开,@Nikos。现在它不流动了
  • 您可以随意编辑!因为事实证明这是一个已知的 qmake 错误,所以有多个答案对我来说看起来更糟。
  • 我希望我的答案保持原样,但谢谢!顺便说一句,我确实赞成你的。认为您应该取消删除它。对同一个问题有多种观点并没有错;这就是系统可以有多个答案的原因!
【解决方案2】:

这是一个已知的 qmake “功能”。当它看到时:

#include "foo.cpp"

在标题中(不管它是否会被“评估”),它根本不会为foo.cpp 生成构建规则,所以它没有被构建。不幸的是,Qt 开发人员似乎并不认为这是一个错误,而是一个特性。

解决方法是创建第三个文件(如foo_incsrc.h),其中只有一行:

#include "foo.cpp"

并相应地更改您的foo.h

#ifndef STATIC_BUILD
#include "foo_incsrc.h"
#endif

【讨论】:

  • 谢谢!是的,在花了很多时间试图在这里找到错误之后,我也想到了同样的事情,但我需要确认。我会报告它,希望它会尽快修复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多