gpt4 book ai didi

c++ - 使用 QMake 进行仅 header 和静态构建

转载 作者:行者123 更新时间:2023-11-30 01:02:08 25 4
gpt4 key购买 nike

我正在尝试建立一个简单的类,它既可以仅用作 header ,也可以与 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”行并使用该类作为 header 只能按预期工作。如果我将此项目编译为静态(上面的行未注释),我会得到“Foo”成员的“ undefined reference ”。

我注意到,“CONFIG += STATIC_BUILD”没有注释,而是注释了该行

#include "foo.cpp"

在 foo.h 中,一切正常(当然,仅适用于静态构建)。这对我来说没有任何意义,因为“ifndef”的确切目的是不在静态构建中“编译”#include。

我做错了什么?

我在 Linux 环境中使用带有 gcc 的 Qt 5.11。

最佳答案

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

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

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

关于c++ - 使用 QMake 进行仅 header 和静态构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56701828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com