簡體   English   中英

使用QMake的僅標頭和靜態構建

[英]Header-only and static build with QMake

我試圖建立一個簡單的類,該類既可以用作標題,也可以與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。

這是一個已知的QMake錯誤,報告了幾次:

(警告:第三次錯誤報告中的不必要的冒犯性語言)

簡而言之,跳過在#include指令中提到的“源文件”構建的機制不夠聰明,無法考慮是否將實際執行#include指令(也就是說,它不了解預處理器條件)。

這是已知的qmake“功能”。 當看到:

#include "foo.cpp"

在標頭中(無論是否進行“評估”),它只是不會為foo.cpp生成生成規則,因此不會生成。 不幸的是,似乎Qt開發人員並不將其視為錯誤,而是功能。

解決方法是創建第三個文件(如foo_incsrc.h ),其中只有一行:

#include "foo.cpp"

並相應地更改您的foo.h

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM