使用Qt和Boost为应用程序编译CppUTest测试时的奇怪行为

时间:2016-07-13 10:22:11

标签: c++ qt boost cpputest

我遇到了问题。当我尝试编译.so库时,一切正常。

#if VIEWS_USE_CAANIMATIONDELEGATE
@interface CheckTest : UIView <CAAnimationDelegate>
#else
@interface CheckTest : UIView
#endif

当我尝试创建用于例如Scanning dependencies of target logger [ 11%] Building CXX object CMakeFiles/logger.dir/src/defaultconfig.cpp.o [ 22%] Building CXX object CMakeFiles/logger.dir/src/loggerstate.cpp.o [ 33%] Building CXX object CMakeFiles/logger.dir/src/configmanager.cpp.o [ 44%] Building CXX object CMakeFiles/logger.dir/src/configuration.cpp.o [ 55%] Building CXX object CMakeFiles/logger.dir/src/formatter.cpp.o [ 66%] Building CXX object CMakeFiles/logger.dir/src/levelmap.cpp.o [ 77%] Building CXX object CMakeFiles/logger.dir/src/logger.cpp.o [ 88%] Building CXX object CMakeFiles/logger.dir/src/logworker.cpp.o [100%] Linking CXX shared library liblogger.so [100%] Built target logger 的可执行文件时。测试文件我遇到了错误。 Full log is here。然而,它编译在开发人员计算机上最有趣的事情。我们检查编译器版本,cmake版本,一切都是相同的。最苛刻的版本并不相同。

也许你们中的任何人都面临这样的问题并知道我们做错了什么。

2 个答案:

答案 0 :(得分:2)

In file included from /opt/Qt5.3.2/5.3/gcc_64/include/QtCore/qobject.h:51:0,
                 from /opt/Qt5.3.2/5.3/gcc_64/include/QtCore/qabstractanimation.h:45,
                 from /opt/Qt5.3.2/5.3/gcc_64/include/QtCore/QtCore:4,
                 from /opt/Qt5.3.2/5.3/gcc_64/include/QtConcurrent/QtConcurrentDepends:2,
                 from /opt/Qt5.3.2/5.3/gcc_64/include/QtConcurrent/QtConcurrent:3,
                 from /tmp/Quantum/src/logger/include/logworker.h:5,
                 from /tmp/Quantum/src/logger/include/logger.h:5,
                 from /tmp/Quantum/src/logger/tests/logger_test.cpp:5:
/opt/Qt5.3.2/5.3/gcc_64/include/QtCore/qlist.h: In member function ‘void QList<T>::node_construct(QList<T>::Node*, const T&)’:
/opt/Qt5.3.2/5.3/gcc_64/include/QtCore/qlist.h:374:44: error: ‘n’ does not name a type
     else if (QTypeInfo<T>::isComplex) new (n) T(t);
                                            ^

错误看起来似乎未包含<new>标头。检查包含路径中某处是否存在另一个名为“new”的文件,并检查没有其他标头定义像_NEW_LIBCPP_NEW这样的宏,这会阻止<new>被包含在内正确。

您可能需要使用-save-temps等标记编译其中一个失败文件,以便检查预处理的输出,查看正在包含的文件以及是否包含其内容。

您还应该告诉CMake是详细的,因此它会打印完整的编译器命令。如果编译失败,隐藏编译的细节是没用的 - 你需要知道发生了什么!

答案 1 :(得分:1)

最后我们击败了这个问题。这里的问题是,@ Jonathan Wakely建议,cpputest定义宏_NEW,以防止new被正确包含。要解决此问题,我们会在包含cpputest标题之前重新排序包含所有库。