我使用lupdate v4.7.2遇到了一个非常奇怪的错误。我收到了错误消息
module / foo.cpp:6:使用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中有一个空主函数。
代码编译(除非我在这里可能产生任何copypasta错误),所以语法基本上是正确的。
答案 0 :(得分:7)
答案是lupdate在解析foo.cpp时无法找到头文件foo.h。使用以下行扩展.pro文件可以解决问题:
INCLUDEPATH += .
然而,令我困扰的是编译器应该无法编译代码,但不知何故,qmake在编译器选项中添加了-I.
。这就是为什么我之前没有想到包含文件的问题,花了几个小时来解决这个问题。有谁知道这是否是默认行为?另外:为什么lupdate没有发出相应的错误消息?
答案 1 :(得分:3)
在我的情况下,lupdate无法解析枚举MyEnum:int {};行并没有达到类声明。 Qt 5.7.1,lupdate仍然不理解枚举的类型说明符。
答案 2 :(得分:1)
我在不同的场景中得到了同样的信息。就我而言,问题是foo.cpp
包含#include <foo.h>
而不是#include "foo.h"
。由于这两个文件都是一个不在全局包含路径中的目录,lupdate
由于include中缺少引号而没有在该目录中查找。切换到正确的分隔符会使lupdate
感到高兴。
答案 3 :(得分:1)
我在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”的问题可以通过使用marco用于术语“enum class”来解决:
#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
答案 4 :(得分:1)
在我的情况下,在实际的类声明之前,在结构中有一个奇怪的(但我认为合法的)格式化类型声明。这使得# include RPi libraries in to Python code
import RPi.GPIO as GPIO
import time
import matplotlib.pyplot as plt
from drawnow import drawnow
# instantiate GPIO as an object
GPIO.setmode(GPIO.BCM)
# define GPIO pins with variables a_pin and b_pin
a_pin = 18
b_pin = 23
gainF = []
gainString = 0
plt.ion()
x_axis = 0
def makeFig():
plt.ylim(200,210)
plt.xlim(0,100)
plt.title('Readings')
plt.grid(True)
plt.ylabel('Gain')
print(gainString)
print(x_axis)
plt.plot(gainString, x_axis)
plt.show()
#plt.plot(gainString, 'ro-', label='Gain dBm')
# create discharge function for reading capacitor data
def discharge():
GPIO.setup(a_pin, GPIO.IN)
GPIO.setup(b_pin, GPIO.OUT)
GPIO.output(b_pin, False)
time.sleep(0.005)
# create time function for capturing analog count value
def charge_time():
GPIO.setup(b_pin, GPIO.IN)
GPIO.setup(a_pin, GPIO.OUT)
count = 0
GPIO.output(a_pin, True)
while not GPIO.input(b_pin):
count = count +1
return count
# create analog read function for reading charging and discharging data
def analog_read():
discharge()
return charge_time()
# provide a loop to display analog data count value on the screen
while True:
print(analog_read())
gainString = analog_read()
x_axis = x_axis + 1
#dataArray = gainString.split(',')
#gain = float(dataArray[0])
#gainF.append(gain)
makeFig()
plt.pause(.000001)
time.sleep(1)
#GPIO.cleanup()
跳过了课程并导致了“不合格”的警告信息。代码看起来像这样(开头不是我的;-)):
lupdate
从struct coords_t {
double x, y;
...
};
struct plotsCollection {
QVarLengthArray<struct coords_t> coords; // problem right here
...
};
class LogsDialog : public QDialog
{
Q_OBJECT
...
}
移除struct
解决了警告。所以在类中移动了struct声明。我做了两个:)
答案 5 :(得分:0)
如果将tr()
-宏放在嵌套得太深的子文件夹中,也会发生此错误。
例如,在以下示例中,命令
lupdate -noobsolete . -ts ts/*
错误消息读取
pwd/a/b/c/c.cpp:5: Qualifying with unknown namespace/class ::C
。
QT += core gui
SOURCES += \
main.cpp \
a/a.cpp \
a/b/b.cpp \
a/b/c/c.cpp
HEADERS += \
a/a.h \
a/b/b.h \
a/b/c/c.h
TRANSLATIONS += \
ts/foo.ts
但是,正如其他人已经提到的那样,*.ts
文件似乎已正确更新。