2011-06-28 36 views
4

我遇到了一個非常奇怪的錯誤,使用lupdate v4.7.2。我收到了錯誤信息lupdate錯誤:符合未知命名空間/類

module/foo.cpp:6: Qualifying with unknown namespace/class ::foo

對於一個項目中的幾個類有大約50個類。我煮沸問題降低到一個簡單的例子:

SRC/project.pro:

QT  += core 
TARGET = test 
TEMPLATE = app 

SOURCES += main.cpp \ 
      screen.cpp 

HEADERS += screen.h 

TRANSLATIONS += de.ts 

的src /模塊/ foo.h中:

namespace sp { 
class foo { 
    initWidgets(); 
}; 
} // namespace sp 

的src /模塊/ Foo.cpp中:

#include <QString> 
#include "module/foo.h" 

namespace sp { 
    foo::initWidgets() { 
    QString bar = tr("bar"); 
} 
} // namespace sp 

main.cpp中有一個空的main函數。代碼編譯(禁止我在這裏可能產生的任何copypasta錯誤),所以語法基本上是正確的。

回答

6

答案是lupdate無法在解析foo.cpp時找到頭文件foo.h。擴展與以下行的.pro文件中刪除的問題:

INCLUDEPATH += . 

然而,還有什麼困擾我的一點是,編譯器應該已經無法編譯代碼,但不知何故,QMAKE增加了-I.到編譯器選項。這就是爲什麼我之前沒有想到包含文件問題,並花了幾個小時困惑了這一點。有誰知道這是否是默認行爲?另外:爲什麼lupdate不會發出適當的錯誤信息?

+2

我有同樣的問題,你的解決方案並沒有立即爲我工作,但指出我在正確的方向。根據[this](https://bugreports.qt-project.org/browse/QTBUG-24587?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel)錯誤報告,問題的根源是lupdate搜索相對於當前目錄的包含文件。在我的情況下,我不得不添加'INCLUDEPATH + = ../ src',因爲當前目錄是'。/ translations'。 – Wutz

+0

@Wutz謝謝。您的評論進一步幫助我解決了構建錯誤。 –

1

我剛剛在不同的場景中得到了同樣的信息。在我的情況下,問題是foo.cpp包含#include <foo.h>而不是#include "foo.h"。由於這兩個文件都是一個不在全局包含路徑中的目錄,所以lupdate由於include中缺少引號而沒有打開目錄。切換到正確的包含分隔符使lupdate開心。

2

在我的情況下,lupdate無法解析枚舉MyEnum:int {};並且未能達到課堂申報。 Qt 5.7.1,lupdate仍然不明白枚舉的類型說明符。

+0

這是我的問題。非常煩人。你找到解決方法嗎? –

0

我在Ubuntu 12.04系統上使用Qt 5.4.1也看到過這個錯誤信息。

但是,錯誤的原因是不同的。至少在使用封裝在名稱空間中的相關前向聲明時,「lupdate」似乎遇到了C++-11強枚舉的問題。

我使用這樣的事情在相關頭文件:

namespace outer { 
namespace other { 
    enum class MyEnum : int; 
} // namespace outer::other 

namespace inner { 
    class MyClass { 
    //... 
    }; 
} // namespace outer::inner 
} // namespace outer 

與「lupdate」可以通過使用馬可的術語「枚舉類」,圍繞工作問題:

#ifndef ENUM_CLASS 
#define ENUM_CLASS enum class 
#endif 

namespace outer { 
namespace other { 
    ENUM_CLASS MyEnum : int; 
} // namespace outer::other 

namespace inner { 
    class MyClass { 
    //... 
    }; 
} // namespace outer::inner 
} // namespace outer 
0

在我的情況下,在實際的類聲明之前,在結構中出現了一個奇怪的(但合法的我猜)格式化類型聲明。這使lupdate跳過課程並導致「不合格」警告消息。該代碼看起來像這樣(不是我開始與;-)):

struct coords_t { 
    double x, y; 
    ... 
}; 

struct plotsCollection { 
    QVarLengthArray<struct coords_t> coords; // problem right here 
    ... 
}; 

class LogsDialog : public QDialog 
{ 
    Q_OBJECT 
    ... 
} 

去除QVarLengthArray<struct coords_t>struct解決了警告。所以在類中移動了結構聲明。我做了兩個:)